繁体   English   中英

ElasticSearch-聚合:过滤和分类存储桶

[英]ElasticSearch - Aggregations: filtering and sorting buckets

使用ElasticSearch 5.2

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

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

我采取的建立聚合查询的步骤:

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

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

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无法处理像这样的简单聚合?

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

这应该可以解决问题:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM