2016-09-23 134 views
0

我需要创建一个聚合,如“范围”,但我需要指定每个存储桶的“where”子句。elasticsearch范围聚合固定桶值

例如,如果我们聚集上的 “年龄” 字段,什么范围AGG报价是:

  • 桶1:〜10
  • 桶2:10〜50
  • 铲斗3:从50

我需要的是:

  • 斗1:5433 4211和76]
  • 桶2:[66和435]
  • 铲斗3:[5455,7968,1,443和765]

我不想创建3 “术语” 聚合与“包含”属性,我需要的是一个聚合与3桶(就像范围报价)。

任何想法或替代?

回答

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

}

0

只有第一个桶会导致问题,因为范围已经停止,但所有其他的都可以通过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 
       ] 
      } 
     } 
    } 
} 
+0

感谢您的答复,但是这并不完全符合我要找的。实际上我的例子并不太好。该范围实际上可以是随机的ID组。 我需要的是: - 斗1:6567,11192,759845,79685] - 斗2:55,896858,459858] - 斗3:689658,696958,70707] – Gustavo

+0

之后,确实,这个例子不太好:-)对不起 – Val