ElasticSearch - 聚合:过滤和排序存储桶

时间:2018-04-04 14:57:32

标签: json elasticsearch

使用ElasticSearch 5.2

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

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

我用来构建聚合查询的步骤:

  1. 过滤原始数据集(filter: age > 30
  2. 汇总'country'
  3. 在字段“salary
  4. 上使用指标平均值

    我面临的问题是我可以在聚合之前应用过滤器,也可以对存储桶进行排序,但似乎ES不允许我同时执行这两种操作? 换句话说:我无法在“order”上应用我的“myInnerAggregation”查询,因为它前面有“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无法处理这样的简单聚合?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这应该可以解决问题:

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