一、为什么每次在批量添加或者删除完成之后查询结果没有更新?
原因:ES默认不执行刷新操作,需要手动设置参数才能在更新文档后立即刷新。
从以下源码中可以看出刷新策略有三种: NONE(“false”)、IMMEDIATE(“true”)、WAIT_UNTIL(“wait_for”)
public static enum RefreshPolicy implements Writeable {
/**
*请求向Elasticsearch提交了数据,不进行数据刷新,直接结束请求。
*这种策略的优点是资源消耗低、写入性能高,缺点是实时性低、数据安全性差。
**/
NONE("false"),
/**
*请求向Elasticsearch提交了数据,立即进行数据刷新,然后再结束请求。
*这种策略的优点是实时性高、操作延时短,缺点是资源消耗高。
**/
IMMEDIATE("true"),
/**
*请求向Elasticsearch提交了数据,等待数据完成刷新,然后再结束请求。
*这种策略的优点是实时性和资源消耗之间有一个平衡,缺点是操作延时较长。
**/
WAIT_UNTIL("wait_for");
private final String value;
private RefreshPolicy(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
public static WriteRequest.RefreshPolicy parse(String value) {
WriteRequest.RefreshPolicy[] var1 = values();
int var2 = var1.length;
for(int var3 = 0; var3 < var2; ++var3) {
WriteRequest.RefreshPolicy policy = var1[var3];
if (policy.getValue().equals(value)) {
return policy;
}
}
if ("".equals(value)) {
return IMMEDIATE;
} else {
throw new IllegalArgumentException("Unknown value for refresh: [" + value + "].");
}
}
public static WriteRequest.RefreshPolicy readFrom(StreamInput in) throws IOException {
return values()[in.readByte()];
}
public void writeTo(StreamOutput out) throws IOException {
out.writeByte((byte)this.ordinal());
}
}
二、 具体操作:
request.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);//插入完成后立即强制刷新索引
添加位置如下:文章来源:https://www.toymoban.com/news/detail-519698.html
//单条增加
IndexRequest request = new IndexRequest();
request.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
//后面省略。。。。。
//批量增加
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
//同上
官网地址:es批量操作官方文档
注:默认是不进行刷新的,因此需要手动添加进行刷新。文章来源地址https://www.toymoban.com/news/detail-519698.html
到了这里,关于Java操作es插入数据后,立即查询没结果解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!