如何在弹性搜索的过滤器聚合中引用多个嵌套级别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在弹性搜索的过滤器聚合中引用多个嵌套级别?相关的知识,希望对你有一定的参考价值。
让我们称我的根级别foo
和我的孩子级别events
。我想在events
级别聚合但是使用过滤器,即event
颜色为“橙色”或者父级foo
有customerId“35”。
所以,我希望有一个嵌套聚合内的过滤器聚合。在这个过滤器的查询子句中,我有一个孩子引用foo
上的字段而另一个孩子引用events
上的字段。但是,第一个孩子无法像这样实际引用父母!我不能使用reverse_nested聚合,因为我不能将其中一个作为复合查询的子项,并且我无法在嵌套之前进行过滤,因为我会以这种方式丢失OR语义。我如何参考foo
上的字段?
具体例子,如果它有帮助。制图:
{
"foo": {
"properties": {
"customer_id": { "type": "long" },
"events": {
"type": "nested",
"properties": {
"color": { "type": "keyword" },
"coord_y": { "type": "double" }
}
}
}
}
}
(为清晰起见更新:这是一个名为foo
的索引,其根映射名为foo
)
我希望能够进行的查询:
{
"aggs": {
"OP0_nest": {
"nested": { "path": "events" },
"aggs": {
"OP0_custom_filter": {
"filter": {
"bool": {
"should": [
{ "term": { "events.color": "orange" } },
{ "term": { "customer_id": 35 } }
]
}
},
"aggs": {
"OP0_op": {
"avg": { "field": "events.coord_y" }
}
}
}
}
}
}
}
当然,这不起作用,因为包含should
的customer_id
子句的孩子不起作用。该术语查询始终为false,因为无法在嵌套聚合内访问customer_id
。
提前致谢!
答案
由于您要应用过滤器的字段位于不同的级别,因此您需要分别对每个级别进行查询,并将它们放在should
查询的bool
子句中,这将成为我们的过滤器聚合的filter
。在这个聚合中,我们然后添加一个嵌套聚合来获得coord_y
的平均值。
聚合将是(更新:因为foo
是从字段名称中删除foo
的索引名称):
{
"aggs": {
"OP0_custom_filter": {
"filter": {
"bool": {
"should": [
{
"term": {
"customer_id": 35
}
},
{
"nested": {
"path": "events",
"query": {
"term": {
"events.color": "orange"
}
}
}
}
]
}
},
"aggs": {
"OP0_op": {
"nested": {
"path": "events"
},
"aggs": {
"OP0_op_avg": {
"avg": {
"field": "events.coord_y"
}
}
}
}
}
}
}
}
以上是关于如何在弹性搜索的过滤器聚合中引用多个嵌套级别?的主要内容,如果未能解决你的问题,请参考以下文章