一、ElasticSearch更新数据后不能立即刷新
向 elasticsearch 中新增一条文档数据后,立即请求查询文档列表,发现刚刚新增的文档查不出来,需要等一会后再次请求查询才能查询出来,随后测试了删除文档列表和更新文档列表中的文档这两个接口,出现了同样的问题,即elasticsearch数据更新有延迟。
1.1、解决方法
一种是设置等待超时时间,但是缺点是不知道什么时候可以修改成功,最好的办法就是手动让es中的数据每次更新后都从 indexing buffer 中刷新到磁盘中,,从而让更新的数据立即可见。
public void batchInsert(List<Data> dataList) {
try {
BulkRequest bulkRequest = new BulkRequest("index");
for (Data data : dataList) {
bulkRequest.add(new IndexRequest()
.id(data.getId().toString())
.source(new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL).writeValueAsString(data), XContentType.JSON));
}
// 手动让es中的数据刷新到磁盘中
bulkRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
}
二、ElasticSearch 查询条数限制
ElasticSearch 官方限制了查询最多只能查询 10000 条数据,查询第 10001 条数据时就会开始报错,Result window is too large, from + size must be less than or equal to。但是在实际项目中,我们会有需要查询超过 10000 条数据的需求,所以需要解除该限制。
1.1、解决方案一
在 kibana 中执行解除索引最大查询数的限制,_all
表示所有索引,针对单个索引的话修改成索引名称即可
PUT /_all/_settings
{
"index.max_result_window":2147483647
}
1.2、解决方案二
修改集群配置config/elasticsearch.yml
文件,增加如下配置
max_result_window: 2147483647
1.3、解决方案三
在创建索引的时候加上
"settings": {
"index":{
"max_result_window": 2147483647
}
}
2、后续操作
在修改完配置以后还需要在查询时候把track_total_hits
设置为true
,就会启用跟踪匹配查询的总点击次数,设置为true就会返回真实的命中条数。
Java 代码中在查询的时候加上
searchSourceBuilder.trackTotalHits(true);
kibana 等工具的 dsl 语句如下
GET 索引名称/_search
{
"query": {
"match_all": {}
},
"track_total_hits": true,
"size":2147483647
}