Elastic Search Terms聚合查询无法返回全部Bucket问题求助
Elasticsearch查询无法返回所有跨多board的serial
需求:通过以下查询获取指定时间范围内、标记为GOOD且在不同board中被使用的所有serial:
{"size":0,"query":{"bool":{"filter":{"range":{"currentDatetime":{"gte":"2024-04-13T01:00:00.000Z","lte":"2024-04-16T01:00:00.000Z"}}},"must":[{"match":{"headers.Type":"GOOD"}}]}},"aggs":{"units":{"terms":{"field":"metrics.serial","size":500},"aggs":{"board":{"terms":{"field":"headers.board","size":3}},"min_2_buckets_selector":{"bucket_selector":{"buckets_path":{"count":"board._bucket_count"},"script":{"inline":"params.count >= 2"}}}}}}}
问题:该查询无法返回全部符合条件的serial,已知存在某个serial在两个不同board中被使用,但直接查询时不显示;仅添加针对该serial的match过滤器时,结果才正常。
补充信息:
- 所有字段均为keyword类型
- 已通过
/_search?preference=_shards:0,1,2跨所有分片执行查询
问题原因
当前units聚合的size设为500,terms聚合默认只返回文档量排名前N的桶。如果目标serial的文档数未进入前500,就不会被纳入聚合,自然无法被后续的bucket_selector筛选出来。
解决方案
方案1:增大terms聚合的size值
根据实际数据量,调大units聚合的size参数,确保覆盖所有可能的serial。例如调整为10000(可根据实际情况修改):
{"size":0,"query":{"bool":{"filter":{"range":{"currentDatetime":{"gte":"2024-04-13T01:00:00.000Z","lte":"2024-04-16T01:00:00.000Z"}}},"must":[{"match":{"headers.Type":"GOOD"}}]}},"aggs":{"units":{"terms":{"field":"metrics.serial","size":10000},"aggs":{"board":{"terms":{"field":"headers.board","size":3}},"min_2_buckets_selector":{"bucket_selector":{"buckets_path":{"count":"board._bucket_count"},"script":{"inline":"params.count >= 2"}}}}}}}
方案2:使用composite聚合(适合大量serial场景)
如果serial数量极大,terms聚合的size调大后性能下降,可改用composite聚合分页获取所有桶,避免遗漏:
{"size":0,"query":{"bool":{"filter":{"range":{"currentDatetime":{"gte":"2024-04-13T01:00:00.000Z","lte":"2024-04-16T01:00:00.000Z"}}},"must":[{"match":{"headers.Type":"GOOD"}}]}},"aggs":{"units":{"composite":{"size":1000,"sources":[{"serial":{"terms":{"field":"metrics.serial"}}}]}},"aggs":{"board":{"terms":{"field":"headers.board","size":3}},"min_2_buckets_selector":{"bucket_selector":{"buckets_path":{"count":"board._bucket_count"},"script":{"inline":"params.count >= 2"}}}}}}
注:composite聚合需要通过
after参数分页获取后续结果,直到返回的after_key为null时停止。
内容的提问来源于stack exchange,提问作者GTpy
相关产品推荐
相关产品推荐

