Elasticsearch聚合 之 Range區間聚合
阿新 • • 發佈:2018-12-30
Elasticsearch提供了多種聚合方式,能幫助使用者快速的進行資訊統計與分類,本篇主要講解下如何使用Range區間聚合。
最簡單的例子,想要統計一個班級考試60分以下、60到80分、80到100分,在ES中只要一個命令就可以輕鬆統計....
聚合例子
按照前言中的例子,可以執行下面的命令:
{ "aggs":{ "grade_ranges":{ "range":{ "field":"grade", "ranges":[ {"to":60}, {"from":60,"to":80}, {"from":80}] } } } }
得到如下的結果:
{ ... "aggregations":{ "price_ranges":{ "buckets":[ { "to":60, "doc_count":2 }, { "from":60, "to":80, "doc_count":32 }, { "from":80, "doc_count":14 } ] } } }
複雜點的例子,指定每個區間的名字
可以通過設定keyed:true,使每個區間都返回一個特定的名字:
{ "aggs":{ "price_ranges":{ "range":{ "field":"price", "keyed":true, "ranges":[ {"to":50}, {"from":50,"to":100}, {"from":100} ] } } } }
預設會按照區間命名:
{ ... "aggregations":{ "price_ranges":{ "buckets":{ "*-50.0":{ "to":50, "doc_count":2 }, "50.0-100.0":{ "from":50, "to":100, "doc_count":4 }, "100.0-*":{ "from":100, "doc_count":4 } } } } }
當然也可以指定區間的名字:
{ "aggs":{ "price_ranges":{ "range":{ "field":"price", "keyed":true, "ranges":[ {"key":"cheap","to":50}, {"key":"average","from":50,"to":100}, {"key":"expensive","from":100} ] } } } }
使用指令碼
與其他的聚合類似,Range聚合支援指令碼的使用:
{ "aggs":{ "price_ranges":{ "range":{ "script":"doc['price'].value", "ranges":[ {"to":50}, {"from":50,"to":100}, {"from":100} ] } } } }
檔案指令碼或者指令碼值的操作都與其他的差不多,就不再贅述了。
聚合巢狀
通常在區間聚合中,都會巢狀子聚合,比如我們在每個區間中做統計stats聚合:
{ "aggs":{ "price_ranges":{ "range":{ "field":"price", "ranges":[ {"to":50}, {"from":50,"to":100}, {"from":100} ]}, "aggs":{ "price_stats":{ "stats":{ "field":"price" } } } } } }
那麼得到的結果會如下所示:
{ "aggregations":{ "price_ranges":{ "buckets":[ { "to":50, "doc_count":2, "price_stats":{ "count":2, "min":20, "max":47, "avg":33.5, "sum":67 } }, { "from":50, "to":100, "doc_count":4, "price_stats":{ "count":4, "min":60, "max":98, "avg":82.5, "sum":330 } }, { "from":100, "doc_count":4, "price_stats":{ "count":4, "min":134, "max":367, "avg":216, "sum":864 } } ] } } }
如果不指定聚合的欄位,那麼預設會按照Range聚合的欄位來做統計:
{ "aggs":{ "price_ranges":{ "range":{ "field":"price", "ranges":[ {"to":50}, {"from":50,"to":100}, {"from":100} ] }, "aggs":{ "price_stats":{ "stats":{} } } } } }