让我们将其称为根级别foo和子级别events。我想在events级别上进行汇总,但要使用一个过滤器,使event的颜色为“橙色”,或者父foo的customerId为“35”。

因此,我想在嵌套聚合中包含一个过滤器聚合。在此过滤器的查询子句中,我有一个 child 引用了foo上的一个字段,另一个引用了events上的一个字段。但是,第一个 child 无法真正引用这样的 parent !我不能使用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子句的子项不起作用。该术语查询始终为假,因为无法在嵌套聚合内部访问customer_id

提前致谢!

最佳答案

由于要在其上应用过滤器的字段位于不同的级别,因此您需要分别对每个级别进行查询,并将它们放在should查询的bool子句中,该子句成为我们过滤器聚合的filter。然后,在此聚合中,我们添加一个嵌套聚合,以获取coord_y的平均值。

聚合将是( UPDATED :由于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"
              }
            }
          }
        }
      }
    }
  }
}

关于elasticsearch - 如何在Elastic Search的过滤器聚合中引用多个嵌套级别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53770652/

10-16 15:47