如何在弹性搜索的过滤器聚合中引用多个嵌套级别?

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" }
            }
          }
        }
      }
    }
  }
}

当然,这不起作用,因为包含shouldcustomer_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"
              }
            }
          }
        }
      }
    }
  }
}

以上是关于如何在弹性搜索的过滤器聚合中引用多个嵌套级别?的主要内容,如果未能解决你的问题,请参考以下文章

弹性搜索/和嵌套可能?

将聚合限制为弹性搜索中的热门内容

弹性搜索 - 使用嵌套过滤数组作为存储桶

弹性搜索桶过滤

除了依靠弹性搜索聚合之外,如何获取其他数据?

我的弹性映射中有一个嵌套对象。我正在尝试为该嵌套对象创建过滤器查询