Elasticsearch 6.7.1按cid分组查询未返回全部符合条件结果的问题
问题原因
Elasticsearch的terms聚合采用分布式分片级统计后合并的机制:
- 每个分片先独立统计自身分片内的cid分组及对应文档数,仅返回各自分片的topN分组(N由
shard_size参数控制,默认值为size*1.5+10) - 协调节点再将所有分片返回的分组做合并、去重、计数排序,最终返回
size个结果(默认size=10)
你遇到的情况是:cid=21的文档分散在多个分片里,每个分片内该cid的文档数都没进入对应分片的topN列表,导致合并后的结果集中根本没有这个分组,因此min_doc_count:2也无法过滤出它。而单独用term查询时,是精准匹配所有包含cid=21的文档,聚合仅统计这些目标文档,所以能得到正确结果。
解决办法
要获取所有文档数≥2的分组,需调整terms聚合的参数,减少分片级统计的遗漏:
- 增大
size参数
默认size为10,设置一个足够大的值,确保所有符合条件的分组都能进入合并后的结果集。示例:
GET my_index/_search { "size": 0, "aggs": { "group_by_cid": { "terms": { "field": "cid", "order": { "_count": "desc" }, "min_doc_count": 2, "size": 1000 // 根据实际分组数量调整 } } } }
- 配合增大
shard_size参数
该参数控制每个分片返回的分组数量,调大它能让每个分片提交更多分组给协调节点合并,进一步降低遗漏概率。示例:
GET my_index/_search { "size": 0, "aggs": { "group_by_cid": { "terms": { "field": "cid", "order": { "_count": "desc" }, "min_doc_count": 2, "size": 1000, "shard_size": 2000 // 一般设置为size的2倍左右 } } } }
- 注意性能平衡
size和shard_size不要设置过大,否则会增加协调节点的内存与CPU消耗。如果你的索引数据量不大且写入频率低,也可以执行_forcemerge将索引合并为单个分片,从根源上消除分布式统计的遗漏问题。
内容的提问来源于stack exchange,提问作者mahfuj asif
相关产品推荐
相关产品推荐

