具有固定桶值的弹性搜索范围聚合

elasticsearch range aggregation with fixed buckets values

我需要创建一个聚合,例如 "range",但我需要指定每个存储桶的 "where" 子句。

例如,如果我们在 "age" 字段上进行聚合,则聚合报价的范围是:

我需要的是:

我不想使用 "include" 属性 创建 3 个 "terms" 聚合,我需要的是一个包含 3 个桶的聚合(就像范围报价一样)。

有什么想法或替代方案吗?

只有第一个桶会导致问题,因为范围已停止,但所有其他桶都可以通过 range 桶中的 from/to 约束轻松指定。我建议这样:

{
    "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
                ]
            }
        }
    }
} 

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

"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"
        }
      }
    }
  }
}

}