当前位置:   article > 正文

elasticsearch中搜索数量不能超过10000的解决方案_searchhits总数

searchhits总数

参考:https://www.phpmianshi.com/?id=250

问题描述

开发环境: JDK1.8、Elasticsearch7.5.1

最近在操作ES进行分页查询(from+size)时,需要返回满足条件的数据总数。我发现满足条件的数据总数一旦超过10000条,返回的结果永远是10000。为什么会被限制只能搜索10000条数据呢?如何查询精确的数据总数呢?
 

问题分析

查看官方文档: Elasticsearch 7.5

Elasicsearch通过index.max_result_window参数控制了能够获取的数据总数from+size的最大值,默认是10000条。但是,由于数据需要从其它节点分别上报到协调节点,因此搜索请求的数据越多,会导致在协调节点占用分配给Elasticsearch的堆内存和搜索、排序时间越大。针对这种满足条件数量较多的深度搜索,官方建议我们使用Scroll。
 

解决方案

1. 调大index.max_result_window(不推荐)
既然知道了是index.max_result_window参数限制了搜索数量,我们可以通过适当调高index.max_result_window的值,以此来满足需求。设置方法如下:

  1. 新建索引:
  2. PUT index_name
  3. {
  4.  "settings": {
  5.    "max_result_window": "100000"
  6.  }
  7. }
  8. #在原有索引的基础上,调大index.max_result_window的默认值:
  9. PUT index_name/_settings?preserve_existing=true
  10. {
  11.  "max_result_window": "100000"
  12. }

这个方案我个人不太推荐,除非能预估出生产环境中索引内数据总量可能达到的上限,否则在未来实际数据量可能会超过设置的值,仍然会再次引发搜索数量受限的问题。

2. cardinality(不推荐)

cardinality字面意思是基数,作为聚合函数,它的作用与Mysql中的distinct类似,用于统计给定字段的不同值的数量。值得注意的是,cardinality获取的仅仅是估计值。使用方式如下:

其中,“distinct_id"是我为聚合函数随便起的名称,可以任意指定,”_id"是希望进行分组统计的字段名称。

  1. GET index_name/_search
  2. {
  3.  "aggs": {
  4.    "distinct_id": {
  5.      "cardinality": {
  6.        "field": "_id"
  7.      }
  8.    }
  9.  }
  10. }

3. track_total_hits(推荐)

  1. GET index_name/_search
  2. {
  3.  "track_total_hits" : true,
  4.  "query": {
  5.    "bool": {
  6.      "must": [
  7.        {
  8.          "match_phrase":{
  9.            "theme":{
  10.              "query":"区块"
  11.            }
  12.          }
  13.        }
  14.        ]
  15.    }
  16.  },
  17.  "from": 0,
  18.  "size": 20
  19. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/402161
推荐阅读
相关标签
  

闽ICP备14008679号