Elasticsearch 如何对nested嵌套字段的聚合结果进行过滤
问题根因
- 顶层nested查询仅过滤符合条件的根文档,不会过滤根文档下的其他嵌套子文档。只要某条根文档存在至少一个
info.type_group_id=2的子文档,该根文档的所有info嵌套子文档都会进入聚合流程,导致统计结果出现非预期值。 - 聚合结构层级错误:你在nested聚合下先执行了未过滤的terms聚合,直接统计了所有info子文档的type_id,后续添加的filter逻辑层级错位,没有作用到terms聚合上。
- 上下文使用错误:
reverse_nested操作会跳出嵌套上下文回到根文档维度,根文档不存在info.type_id字段,因此后续的inner_docs聚合无法拿到正确的嵌套字段值。
修正后的查询
{ "from": 0, "size": 0, "_source": { "excludes": ["*"] }, "query": { "bool": { "must": [ { "nested": { "path": "info", "query": { "term": { "info.type_group_id": 2 } } } } ] } }, "aggs": { "info_nested": { "nested": { "path": "info" }, "aggs": { "filter_valid_group": { "filter": { "term": { "info.type_group_id": 2 } }, "aggs": { "agg_by_type_id": { "terms": { "field": "info.type_id", "size": 10000 } } } } } } } }
逻辑说明
- 首先通过
nested聚合进入info嵌套字段上下文,所有子聚合的操作对象都是info子文档 - 执行
filter聚合,仅保留info.type_group_id=2的子文档,排除同根文档下其他不符合条件的嵌套子文档 - 最后对过滤后的子文档执行terms聚合统计type_id,结果不会出现非预期值
内容的提问来源于stack exchange,提问作者Aleksandra Maslennikova
相关产品推荐
相关产品推荐

