ElasticSearch聚合语法学习(bucket,metric,hitogram,date hitogram)
ElasticSearch聚合語法學習
目錄
1. bucket與metric兩個核心概念
基于city劃分buckets,劃分出來兩個bucket,一個是北京bucket,一個是上海bucket
按照某個字段進行bucket劃分,那個字段的值相同的那些數據,就會被劃分到一個bucket中
有一些mysql的sql知識的話,聚合,首先第一步就是分組,對每個組內的數據進行聚合分析,分組,就是我們的bucket
metric:對一個數據分組執行的統計
當我們有了一堆bucket之后,就可以對每個bucket中的數據進行聚合分詞了,比如說計算一個bucket內所有數據的數量,或者計算一個bucket內所有數據的平均值,最大值,最小值
metric,就是對一個bucket執行的某種聚合分析的操作,比如說求平均值,求最大值,求最小值
2. 插入數據
PUT /tvs {"mappings": {"sales": {"properties": {"price": {"type": "long"},"color": {"type": "keyword"},"brand": {"type": "keyword"},"sold_date": {"type": "date"}}}} } POST /tvs/sales/_bulk { "index": {}} { "price" : 1000, "color" : "紅色", "brand" : "長虹", "sold_date" : "2016-10-28" } { "index": {}} { "price" : 2000, "color" : "紅色", "brand" : "長虹", "sold_date" : "2016-11-05" } { "index": {}} { "price" : 3000, "color" : "綠色", "brand" : "小米", "sold_date" : "2016-05-18" } { "index": {}} { "price" : 1500, "color" : "藍色", "brand" : "TCL", "sold_date" : "2016-07-02" } { "index": {}} { "price" : 1200, "color" : "綠色", "brand" : "TCL", "sold_date" : "2016-08-19" } { "index": {}} { "price" : 2000, "color" : "紅色", "brand" : "長虹", "sold_date" : "2016-11-05" } { "index": {}} { "price" : 8000, "color" : "紅色", "brand" : "三星", "sold_date" : "2017-01-01" } { "index": {}} { "price" : 2500, "color" : "藍色", "brand" : "小米", "sold_date" : "2017-02-12" }3. 統計哪種顏色電視銷量最高
GET /tvs/sales/_search {"size" : 0,"aggs" : { "popular_colors" : { "terms" : { "field" : "color"}}} }4. 統計每種顏色電視平均價格
GET /tvs/sales/_search {"size" : 0,"aggs": {"colors": {"terms": {"field": "color"},"aggs": { "avg_price": { "avg": {"field": "price" }}}}} }按照color去分bucket,可以拿到每個color bucket中的數量,這個僅僅只是一個bucket操作,doc_count其實只是es的bucket操作默認執行的一個內置metric
除了bucket操作,分組,還要對每個bucket執行一個metric聚合統計操作
在一個aggs執行的bucket操作(terms),平級的json結構下,再加一個aggs,這個第二個aggs內部,同樣取個名字,執行一個metric操作,avg,對之前的每個bucket中的數據的指定的field,price field,求一個平均值
metric,就是一個對一個bucket分組操作之后,對每個bucket都要執行的一個metric
第一個metric,avg,求指定字段的平均值
5. bucket嵌套實現顏色+品牌的多層下鉆
從顏色到品牌進行下鉆分析,每種顏色的平均價格,以及找到每種顏色每個品牌的平均價格
我們可以進行多層次的下鉆
比如說,現在紅色的電視有4臺,同時這4臺電視中,有3臺是屬于長虹的,1臺是屬于小米的
下鉆的意思是,已經分了一個組了,比如說顏色的分組,然后還要繼續對這個分組內的數據,再分組,比如一個顏色內,還可以分成多個不同的品牌的組,最后對每個最小粒度的分組執行聚合分析操作,這就叫做下鉆分析
es,下鉆分析,就要對bucket進行多層嵌套,多次分組
按照多個維度(顏色+品牌)多層下鉆分析,而且學會了每個下鉆維度(顏色,顏色+品牌),都可以對每個維度分別執行一次metric聚合操作
6. 統計每種顏色電視最大最小,總和價格
count:bucket,terms,自動就會有一個doc_count,就相當于是count
avg:avg aggs,求平均值
max:求一個bucket內,指定field值最大的那個數據
min:求一個bucket內,指定field值最小的那個數據
sum:求一個bucket內,指定field值的總和
一般來說,90%的常見的數據分析的操作,metric,無非就是count,avg,max,min,sum
7. hitogram按價格區間統計電視銷量和銷售額
interval:2000,劃分范圍,0-2000,2000-4000,4000-6000,6000-8000,8000-10000,buckets去根據price的值,比如2500,看落在哪個區間內,比如2000-4000,此時就會將這條數據放入2000-4000對應的那個bucket中
bucket劃分的方法,terms,將field值相同的數據劃分到一個bucket中
bucket有了之后,一樣的,去對每個bucket執行avg,count,sum,max,min,等各種metric操作,聚合分析
8. date hitogram之統計每月電視銷量
date histogram,按照我們指定的某個date類型的日期field,以及日期interval,按照一定的日期間隔,去劃分bucket
date interval = 1m,
然后會去掃描每個數據的date field,判斷date落在哪個bucket中,就將其放入那個bucket
2017-01-05,就將其放入2017-01-01~2017-01-31,就是一個bucket
min_doc_count:即使某個日期interval,2017-01-01~2017-01-31中,一條數據都沒有,那么這個區間也是要返回的,不然默認是會過濾掉這個區間的
extended_bounds,min,max:劃分bucket的時候,會限定在這個起始日期,和截止日期內
9. 下鉆分析之統計每季度每個品牌的銷售額
GET /tvs/sales/_search {"size": 0,"aggs": {"group_by_sold_date": {"date_histogram": {"field": "sold_date","interval": "quarter","format": "yyyy-MM-dd","min_doc_count": 0,"extended_bounds": {"min": "2016-01-01","max": "2017-12-31"}},"aggs": {"group_by_brand": {"terms": {"field": "brand"},"aggs": {"sum_price": {"sum": {"field": "price"}}}},"total_sum_price": {"sum": {"field": "price"}}}}} } {"took": 10,"timed_out": false,"_shards": {"total": 5,"successful": 5,"failed": 0},"hits": {"total": 8,"max_score": 0,"hits": []},"aggregations": {"group_by_sold_date": {"buckets": [{"key_as_string": "2016-01-01","key": 1451606400000,"doc_count": 0,"total_sum_price": {"value": 0},"group_by_brand": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": []}},{"key_as_string": "2016-04-01","key": 1459468800000,"doc_count": 1,"total_sum_price": {"value": 3000},"group_by_brand": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"key": "小米","doc_count": 1,"sum_price": {"value": 3000}}]}},{"key_as_string": "2016-07-01","key": 1467331200000,"doc_count": 2,"total_sum_price": {"value": 2700},"group_by_brand": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"key": "TCL","doc_count": 2,"sum_price": {"value": 2700}}]}},{"key_as_string": "2016-10-01","key": 1475280000000,"doc_count": 3,"total_sum_price": {"value": 5000},"group_by_brand": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"key": "長虹","doc_count": 3,"sum_price": {"value": 5000}}]}},{"key_as_string": "2017-01-01","key": 1483228800000,"doc_count": 2,"total_sum_price": {"value": 10500},"group_by_brand": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"key": "三星","doc_count": 1,"sum_price": {"value": 8000}},{"key": "小米","doc_count": 1,"sum_price": {"value": 2500}}]}},{"key_as_string": "2017-04-01","key": 1491004800000,"doc_count": 0,"total_sum_price": {"value": 0},"group_by_brand": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": []}},{"key_as_string": "2017-07-01","key": 1498867200000,"doc_count": 0,"total_sum_price": {"value": 0},"group_by_brand": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": []}},{"key_as_string": "2017-10-01","key": 1506816000000,"doc_count": 0,"total_sum_price": {"value": 0},"group_by_brand": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": []}}]}} }總結
以上是生活随笔為你收集整理的ElasticSearch聚合语法学习(bucket,metric,hitogram,date hitogram)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ElasticSearch搜索语法学习(
- 下一篇: ElasticSearch搜索语法进阶学