具有固定桶值的elasticsearch范围聚合

时间:2016-09-23 03:06:37

标签: elasticsearch range fixed aggregation

我需要创建一个聚合,比如“range”,但是我需要指定每个桶的“where”子句。

例如,如果我们在“年龄”字段上聚合,那么agg提供的范围是:

  • 桶1:到10
  • 桶2:从10到50
  • 斗3:从50

我需要的是:

  • 斗1:[5,4334,211和76]
  • 斗2:[66和435]
  • 斗3:[5455,7968,1,443和765]

我不想用“include”属性创建3个“术语”聚合,我需要的是一个带有3个桶的聚合(就像范围提供一样)。

任何想法或替代方案?

2 个答案:

答案 0 :(得分:0)

由于范围已停止,因此只有第一个存储桶会导致问题,但在from/to存储桶中使用range约束可以轻松指定所有其他存储桶。我建议这样的事情:

{
    "aggs" : {
        "age_ranges" : {
            "range" : {
                "field" : "age",
                "ranges" : [
                    { "from": 5,  "to": 6 },     <--- only 5
                    { "from": 10, "to": 13 },    <--- 10, 11, 12
                    { "from": 13, "to": 15 },    <--- 13, 14
                    { "from": 20, "to": 26 }     <--- 20, 21, 22, 23, 24, 25
                ]
            }
        }
    }
} 

答案 1 :(得分:0)

因此,还有另一种方法可以使用术语聚合和脚本来获得类似的结果。

"aggs": {
"age_ranges": {
  "terms": {
    "script": {
      "inline": "if(ageMap.containsKey(doc['age'].value)){ageMap.get(doc['age'].value)} else {'<unmapped>'} ",
      "params": {
        "contentIdMapping": {
          "1": "bucket-3",
          "5": "bucket-1",
          "66": "bucket-2",
          "76": "bucket-1",
          "211": "bucket-1",
          "435": "bucket-2",
          "443": "bucket-3",
          "765": "bucket-3",
          "4334": "bucket-1",
          "5455": "bucket-3",
          "7968": "bucket-3"
        }
      }
    }
  }
}

}