欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ElasticSearch的search.max_buckets值1000限制问题

程序员文章站 2022-05-19 10:04:45
...

环境:ElasticSearch6.7
问题描述:

{ "error": { "root_cause": [], "type": "search_phase_execution_exception", "reason": "", "phase": "fetch", "grouped": true, "failed_shards": [], "caused_by": { "type": "too_many_buckets_exception", "reason": "Trying to create too many buckets. Must be less than or equal to: [10000] but was [10001]. This limit can be set by changing the [search.max_buckets] cluster level setting.", "max_buckets": 10000 } }, "status": 503 }

设置:这是6.x版本才有的特性,目的:限制大批量聚合操作,规避性能风险。
解决方案:setting里设置:search.max_buckets
问题分析:
这是因为查询结果在分片上找到的条目超过了限定的10000个,官网限制在10000是为了其性能考虑的。需要调大search.max_buckets这个参数。我们先来做如下一个测试:

测试
1、前提: search.max_buckets: 3

PUT /_cluster/settings
{"persistent": {"search.max_buckets": 3}}

2、插入了"A",“B”,“C”,“D” 4条数据

PUT /testBucket/_doc/1 
{"term":"A"}
PUT /testBucket/_doc/2 
{"term":"B"}
PUT /testBucket/_doc/3 
{"term":"C"}
PUT /testBucket/_doc/4 
{"term":"D"}

要分两种情况来说明:

2.1、 索引只有一个分片(分片可以自己在setting设置,)
这时候不管你设不设size,哪怕size=1都会报错!
原因就是上面说的那个,因为它在这个分片上找到的条目超过了限定的3个(实际有4个)

POST /testBucket/_search
{"aggs":{"term":{"terms":{"field":"term","size":2}}}

ElasticSearch的search.max_buckets值1000限制问题

2.2、 如果这个索引有5个分片,数据分散在各个分片上面

index                          shard prirep state   docs  store ip        node
a                              1     p      STARTED    1    3kb 127.0.0.1 es0
a                              3     p      STARTED    1    3kb 127.0.0.1 es0
a                              4     p      STARTED    1    3kb 127.0.0.1 es0
a                              2     p      STARTED    0   208b 127.0.0.1 es0
a                              0     p      STARTED    1    3kb 127.0.0.1 es0

这时如果你设size=2,就不会报错。
因为还没有等它找完全部分片,他就找到了你想要的2个,就返回了。

如果你不设size,或者设一个大值size=10,它就必须找完全部分片,
这时就会遇到限定3,就会报错

所以这和你的数据在分片上的分布有关,
解决办法还是加大search.max_buckets

所以最初问题的解决方法是:

PUT /_cluster/settings
{"persistent": {"search.max_buckets": 20000}}

如果还不够,你你把它调大到1000000000应该是可以了( ﹁ ﹁ ) ~→
官网地址:
https://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-bucket.html

相关讨论:https://github.com/elastic/elasticsearch/pull/27581