【问题标题】:ElasticSearch - Aggregations: filtering and sorting bucketsElasticSearch - 聚合:过滤和排序桶
【发布时间】:2018-09-14 05:00:00
【问题描述】:

使用 ElasticSearch 5.2

作为示例,我将使用代表世界上所有人的数据库。

示例请求:获取按国家/地区分组的 30 岁以上所有人的平均工资。 (响应应包含平均工资排名前 10 的国家/地区)

我构建聚合查询的步骤:

  1. 过滤原始数据集 (filter: age > 30)
  2. 在“country”上聚合
  3. 在字段“salary”上使用度量平均值

我面临的问题是我可以在聚合之前应用过滤器,或者对存储桶进行排序,但似乎 ES 不允许我同时执行这两种操作?
换句话说:我不能在“myInnerAggregation”上应用我的“order”查询,因为它前面是“myFilterAggregation

GET myIndex/_search
{
  "size":0,
  "aggs": {
  "myAggregation": {
  "terms": {
    "size":10,
    "field": "country",
    "order": [
      {
        "myInnerAggregation": "desc"
          // I cannot specify "myInnerAggregation" here, only 
          // "myFilterAggregation" (because it's out of scope I guess)
      }
    ]
  },
  "aggs": {
    "myFilterAggregation": {
      "filter": { /* age > 30 (filter syntax is not the problem)*/},
      "aggs": {
        "myInnerAggergation": {
          "avg": {
            "field": "salary"
          }
        }
      }
    }
  }
}

} }

我已经看到 ES 6.1+ 支持“bucket_sort”,这可能会解决这个问题,但我不敢相信像这样的简单聚合不能被 ES 5.2 处理?

【问题讨论】:

    标签: json elasticsearch


    【解决方案1】:

    尝试将过滤器移至请求的query 部分。您不必将过滤器声明为聚合,聚合尊重在您的请求的query 部分中定义的过滤器。希望通过这种方式您可以解决您的问题。

    【讨论】:

      【解决方案2】:

      这应该可以解决问题:

      "order": [
            {
              "MyFilterAggregation>MyInnerAggregation": "desc"
            }
          ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-04
        • 1970-01-01
        • 1970-01-01
        • 2017-04-15
        • 2021-01-30
        • 2021-08-04
        • 2019-12-02
        • 1970-01-01
        相关资源
        最近更新 更多