Elasticsearch嵌套字段聚合中如何添加普通字段筛选条件
问题原因
- 嵌套聚合作用域限制:进入
nested路径为purchases的聚合后,当前上下文仅能访问purchases下的字段,根文档的is_member字段不在该作用域内,所以is_member: false的过滤条件无法匹配任何数据,导致none_member_amount返回值均为0。 - 原有查询存在JSON结构错误:
pur_channel_id下的聚合定义重复嵌套了aggs字段,pur_channel_amount的聚合层级配置错误。
正确查询写法
{ "size": 0, "query": { "match_all": {} }, "aggs": { "purchases": { "nested": { "path": "purchases" }, "aggs": { "pur_channel_id": { "terms": { "field": "purchases.pur_channel_id", "size": 10 }, "aggs": { "pur_channel_amount": { "sum": { "field": "purchases.pur_amount" } }, "none_member_calc": { "reverse_nested": {}, "aggs": { "filter_none_member": { "filter": { "term": { "is_member": false } }, "aggs": { "back_to_purchases": { "nested": { "path": "purchases" }, "aggs": { "none_member_amount": { "sum": { "field": "purchases.pur_amount" } } } } } } } } } } } } } }
逻辑说明
- 首先进入
purchases嵌套聚合,按pur_channel_id分组,先统计全量的对应渠道总金额pur_channel_amount - 调用
reverse_nested回到根文档上下文,此时可以访问根文档的is_member字段 - 过滤出
is_member: false的根文档后,再次进入purchases嵌套上下文,统计该渠道下非会员用户对应的购买金额总和
内容的提问来源于stack exchange,提问作者jiajun
相关产品推荐
相关产品推荐

