#<center> 聚合查詢(Bucket聚合)</center>html
上一篇講了Elasticsearch聚合查詢中的Metric聚合:Elasticsearch(8) --- 聚合查詢(Metric聚合)json
說明
本文主要參考於Elasticsearch 官方文檔 7.3版本。 Bucket Aggregationsapp
概念
:Bucket 能夠理解爲一個桶,它會遍歷文檔中的內容,凡是符合某一要求的就放入一個桶中,分桶至關與 SQL 中的 group by。elasticsearch
這篇博客講的桶的關鍵字有:Terms Aggregation
、Filter Aggregation
、Histogram Aggregation
、Range Aggregation
、Date Aggregation
。ide
DELETE cars PUT cars { "mappings": { "properties": { "price": { "type":"long" }, "color": { "type":"keyword" }, "brand": { "type":"keyword" }, "sellTime": { "type":"date" } } } }
屬性字段:價格、顏色、品牌、銷售時間ui
POST /cars/_bulk { "index": {}} { "price" : 80000, "color" : "red", "brand" : "BMW", "sellTime" : "2014-01-28" } { "index": {}} { "price" : 85000, "color" : "green", "brand" : "BMW", "sellTime" : "2014-02-05" } { "index": {}} { "price" : 120000, "color" : "green", "brand" : "Mercedes", "sellTime" : "2014-03-18" } { "index": {}} { "price" : 105000, "color" : "blue", "brand" : "Mercedes", "sellTime" : "2014-04-02" } { "index": {}} { "price" : 72000, "color" : "green", "brand" : "Audi", "sellTime" : "2014-05-19" } { "index": {}} { "price" : 60000, "color" : "red", "brand" : "Audi", "sellTime" : "2014-06-05" } { "index": {}} { "price" : 40000, "color" : "red", "brand" : "Audi", "sellTime" : "2014-07-01" } { "index": {}} { "price" : 35000, "color" : "blue", "brand" : "Honda", "sellTime" : "2014-08-12" }
命令spa
GET /_cat/count/cars?v
能夠看到該索引存在,而且有8條文檔數據。.net
<br>3d
官方7.3文檔:Terms Aggregationcode
概念
: 根據某一項的每一個惟一的值的聚合。
GET cars/_search?size=0 { "aggs" : { "genres" : { "terms" : { "field" : "brand" } } } }
返回結果
GET cars/_search?size=0 { "aggs" : { "cars" : { "terms" : { "field" : "brand", "size" : 3 } } } }
返回
從圖中能夠看出文檔數量前三的桶。
GET cars/_search?size=0 { "aggs" : { "genres" : { "terms" : { "field" : "brand", "order" : { "_count" : "asc" } } } } }
GET cars/_search?size=0 { "aggs" : { "brands" : { "terms" : { "field" : "brand", "min_doc_count": 3 } } } }
GET /cars/_search?size=0 { "aggs" : { "JapaneseCars" : { "terms" : { "field" : "brand", "include" : ["BMW", "Audi"] } } } }
這裏也只展現些經常使用的,更多有關Terms Aggregation那就看官網吧。 <br>
官方文檔: Filter Aggregation 和 Filters Aggregation
Filter概念
:指具體的域和具體的值,能夠說是在 Terms Aggregation 的基礎上進行了過濾,只對特定的值進行了聚合。
GET /cars/_search?size=0 { "aggs" : { "brands" : { "filter" : { "term": { "brand": "BMW" } }, "aggs" : { "avg_price" : { "avg" : { "field" : "price" } } } } } }
返回
Filters概念
: Filter Aggreagtion 只能指定一個過濾條件,響應也只是單個桶。若是想要只對多個特定值進行聚合,使用 Filter Aggreagtion 只能進行屢次請求。
而使用 Filters Aggreagation 就能夠解決上述的問題,它能夠指定多個過濾條件,也是說能夠對多個特定值進行聚合。
GET /cars/_search?size=0 { "size": 0, "aggs" : { "cars" : { "filters" : { "filters" : { "colorBucket" : { "match" : { "color" : "red" }}, "brandBucket" : { "match" : { "brand" : "Audi" }} } } } } }
返回
<br>
概念
Histogram與Terms聚合相似,都是數據分組,區別是Terms是按照Field的值分組,而Histogram能夠按照指定的間隔對Field進行分組
GET /cars/_search?size=0 { "aggs" : { "prices" : { "histogram" : { "field" : "price", "interval" : 10000 } } } }
返回
上面的分桶咱們能夠發現價格在5000~6000 的文檔沒有也顯示爲0,咱們想把若是桶中沒有文檔就不顯示該桶
GET /cars/_search?size=0 { "aggs" : { "prices" : { "histogram" : { "field" : "price", "interval" : 10000, "min_doc_count" : 1 } } } }
返回
<br>
官方文檔:Range Aggregation
概念
: 根據用戶傳遞的範圍參數做爲桶,進行相應的聚合。在同一個請求中,能夠傳遞多組範圍,每組範圍做爲一個桶。
GET /cars/_search?size=0 { "aggs" : { "price_ranges" : { "range" : { "field" : "price", "ranges" : [ { "to" : 50000 }, { "from" : 5000, "to" : 80000 }, { "from" : 80000 } ] } } } }
返回
咱們也能夠指定key的名稱
GET /cars/_search?size=0 { "aggs" : { "price_ranges" : { "range" : { "field" : "price", "ranges" : [ { "key" : "xiaoyu", "to" : 50000 }, { "key" : "baohan", "from" : 5000, "to" : 80000 }, { "key" : "dayu", "from" : 80000 } ] } } } }
返回
##<font color=#FFD700> 6、 Date Aggregation</font>
官方文檔: Date Histogram Aggregation 和 Date Range Aggregation
Date Histogram概念
針對於時間格式數據的直方圖聚合,基本的特性與 Histogram Aggregation 一致。
注意
官方文檔這裏不是interval而是calendar_interval,可是按照這樣操做會報錯,由於我看的7.3的文檔,而我部署的es是7.1版本。說明這個地方7.3有了改進。
POST /cars/_search?size=0 { "aggs" : { "sales_over_time" : { "date_histogram" : { "field" : "sellTime", "interval" : "1M", "format" : "yyyy-MM-dd" } } } }
返回
Date Range概念
:針對於時間格式數據的範圍聚合,基本的特性與 Range Aggreagtion 一致。
POST /cars/_search?size=0 { "aggs": { "range": { "date_range": { "field": "sellTime", "format": "MM-yyyy", "ranges": [ { "to": "now-10M/M" }, { "from": "now-10M/M" } ] } } } }
上面的意思是10個月前的分爲一個桶,10個月前以後的分爲一個桶
<br> ###<font color=#FFD700> 參考</font>
一、Elasticsearch核心技術與實戰---阮一鳴(eBay Pronto平臺技術負責人
三、Elasticsearch聚合——Bucket Aggregations
<br> <br>
我相信,不管從此的道路多麼坎坷,只要抓住今天,早晚會在奮鬥中嚐到人生的甘甜。抓住人生中的一分一秒,賽過虛度中的一月一年!(14)
<br>
原文出處:https://www.cnblogs.com/qdhxhz/p/11575408.html