ElasticSearch 相关问题

Java
397
0
0
2022-10-22
标签   Elasticsearch

一、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
}