Elasticsearch - 将普通字段过滤器添加到嵌套字段聚合
Posted
技术标签:
【中文标题】Elasticsearch - 将普通字段过滤器添加到嵌套字段聚合【英文标题】:Elasticsearch - add normal field filter to nested field aggregation 【发布时间】:2021-11-06 21:16:45 【问题描述】:我在 ES 中有如下文档结构:
customer_id: 1,
is_member: true,
purchases: [
pur_id: 1,
pur_channel_id: 1,
pur_amount: 100.00,
pur_date: '2021-08-01'
,
pur_id: 2,
pur_channel_id: 2,
pur_amount: 100.00,
pur_date: '2021-08-02'
]
,
customer_id: 2,
is_member: false,
purchases: [
pur_id: 3,
pur_channel_id: 1,
pur_amount: 200.00,
pur_date: '2021-07-01'
,
pur_id: 4,
pur_channel_id: 3,
pur_amount: 300.00,
pur_date: '2021-07-02'
]
我想通过 purchase.pur_channel_id 聚合总和,并且对于每个子聚合,我想在包含“is_member=false”的文档上添加子聚合聚合,因此,我编写了以下查询:
"size": 0,
"query":
"match_all":
,
"aggs":
"purchases":
"nested":
"path": "purchases"
,
"aggs":
"pur_channel_id":
"terms":
"field": "purchases.pur_channel_id",
"size": 10
,
"aggs":
"none_member":
"filter":
"term":
"is_member": false
,
"aggs":
"none_member_amount":
"sum":
"field": "purchases.pur_amount"
,
"aggs":
"pur_channel_amount":
"sum":
"field": "purchases.pur_amount"
查询运行成功,而我为所有“none_member_amount”得到 0。我想知道可能无法在嵌套聚合中添加普通字段。
请帮忙!谢谢。
【问题讨论】:
【参考方案1】:嵌套聚合在嵌套块级别运行,因此您的查询是在嵌套文档中搜索 is_member 字段。要重新加入父文档,您需要使用 reverse nested aggregation 或者您可以使用过滤聚合在嵌套聚合之前移动 is_member 检查。
【讨论】:
以上是关于Elasticsearch - 将普通字段过滤器添加到嵌套字段聚合的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch:Keep words token 过滤器
elasticsearch中不同字段中的两个过滤器(RANGE)
elasticsearch基本查询笔记(三)-- es查询总结
Elasticsearch7.8.0版本入门——JavaAPI操作(查询并字段过滤文档)