在批量添加或者删除完成之后查询结果没有更新?
原因:ES默认不执行刷新操作 NONE(“false”);需要手动设置参数才能在更新文档后立即刷新 IMMEDIATE(“true”)。
不设置手动刷新,需要等待大概一秒后可查询出数据;往往前端在调用时会新增完数据跟着查询接口,这时会导致新增数据没有显示。
从以下源码中可以看出刷新策略有三种: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());
}
}
设置刷新枚举值IMMEDIATE(“true”):新增数据后立即进行数据刷新
request.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
批量新增索引数据
//单条增加
IndexRequest request = new IndexRequest();
request.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
//批量增加
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);