2015-05-24 108 views
4

使用Elasticsearch直方圖功能,我可以通過指定時間間隔將各種「範圍」的數據放入存儲桶中。在這種情況下, '50':Elasticsearch直方圖,多種間隔類型?

價格: 0-50 50-100 100-150 150-200 200-250 等

這工作得很好,但這返回一個相當長的名單的水桶。我寧願是:

0-50 50-100 100-200 200-400 400-1000 1000+

或者喜歡的東西。是否有可能告訴ES它應該返回什麼間隔(/範圍)?

回答

3

您需要使用numeric range聚集,它允許你指定究竟哪些間隔你想,像這樣的:

{ 
    "aggs" : { 
     "price_ranges" : { 
      "range" : { 
       "field" : "price", 
       "ranges" : [ 
        { "to" : 50 }, 
        { "from" : 50, "to" : 100 }, 
        { "from" : 100, "to": 200 }, 
        { "from" : 200, "to": 400 }, 
        { "from" : 400, "to": 1000 }, 
        { "from" : 1000 } 
       ] 
      } 
     } 
    } 
} 

這應該給你你期待什麼。

+1

這實際上回答了一個問題,而我的回答只是提供了有關如何以非直接方式使用直方圖聚合的更多想法。 – tiurin

3

文檔明確地說,關於該histogram aggregation

它動態地構建固定大小(也稱爲間隔)上的值桶。

我能想到的是,爲了降低桶的數量,你可以申請對數刻度(或任何其他非線性度,如平方根,這將使您的特定數據集足夠的粒度)將值使用腳本選項:

{ 
    "aggs": { 
     "prices": { 
      "histogram": { 
       "field": "price", 
       "script": "Math.log10(_value)", 
       "interval": 1 
      } 
     } 
    } 
} 

這將使桶用鍵1,2,3,…即代表原始值的時間間隔[0內; 10),[10; 100),[100; 1000),…

通過應用反轉功能(10 x在這種情況下)到客戶端的密鑰,您可以恢復原始比例。