Elasticsearch提供了多種聚合方式,能幫助用戶快速的進行信息統計與分類,本篇主要講解下如何使用Range區間聚合。html
最簡單的例子,想要統計一個班級考試60分如下、60到80分、80到100分,在ES中只要一個命令就能夠輕鬆統計....spa
更多資料參考:Elasticsearch文檔翻譯翻譯
按照前言中的例子,能夠執行下面的命令:code
{ "aggs":{ "grade_ranges":{ "range":{ "field":"grade", "ranges":[ {"to":60}, {"from":60,"to":80}, {"from":80}] } } } }
獲得以下的結果:htm
{ ... "aggregations":{ "price_ranges":{ "buckets":[ { "to":60, "doc_count":2 }, { "from":60, "to":80, "doc_count":32 }, { "from":80, "doc_count":14 } ] } } }
能夠經過設置keyed:true,使每一個區間都返回一個特定的名字:blog
{ "aggs":{ "price_ranges":{ "range":{ "field":"price", "keyed":true, "ranges":[ {"to":50}, {"from":50,"to":100}, {"from":100} ] } } } }
默認會按照區間命名:ip
{ ... "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聚合支持腳本的使用:get
{ "aggs":{ "price_ranges":{ "range":{ "script":"doc['price'].value", "ranges":[ {"to":50}, {"from":50,"to":100}, {"from":100} ] } } } }
文件腳本或者腳本值的操做都與其餘的差很少,就再也不贅述了。io
一般在區間聚合中,都會嵌套子聚合,好比咱們在每一個區間中作統計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":{} } } } } }