主要內(nèi)容:聚合分析的平均值、最大值、數(shù)量、求和、histogram以及date histogram實戰(zhàn)
1、_bucket嵌套實現(xiàn)多層下鉆分析
1.1、avg求平均值
比如說:
紅色電視中的3臺長虹的平均價格是多少?
紅色電視中的1臺小米的平均價格是多少?
下鉆的意思是,已經(jīng)分了一個組了,比如說顏色的分組,然后還要繼續(xù)對這個分組內(nèi)的數(shù)據(jù),再分組,比如一個顏色內(nèi),還可以分成多個不同的品牌的組,最后對每個最小粒度的分組執(zhí)行聚合分析操作,這就叫做下鉆分析
es,下鉆分析,就要對bucket進行多層嵌套,多次分組
bucket,分組操作,histogram,按照某個值指定的interval,劃分一個一個的bucket
按照多個維度(顏色+品牌)多層下鉆分析,而且學會了每個下鉆維度(顏色,顏色+品牌),都可以對每個維度分別執(zhí)行一次metric聚合操作
GET /tvs/_search
{
"size": 0,
"aggs": {
"group_by_color": {
"terms": {
"field": "color"
},
"aggs": {
"color_avg_price": {
"avg": {
"field": "price"
}
},
"group_by_brand": {
"terms": {
"field": "brand"
},
"aggs": {
"brand_avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
}
}
1.2、max,min,count,sum
count:bucket,terms,自動就會有一個doc_count,就相當于是count
max:求一個bucket內(nèi),指定field值最大的那個數(shù)據(jù)
min:求一個bucket內(nèi),指定field值最小的那個數(shù)據(jù)
sum:求一個bucket內(nèi),指定field值的總和
求總和,就可以拿到一個顏色下的所有電視的銷售總額
GET /tvs/_search
{
"size": 0,
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
},
"min_price": {
"min": {
"field": "price"
}
},
"max_price": {
"max": {
"field": "price"
}
},
"sum_price": {
"sum": {
"field": "price"
}
}
}
}
}
}
1.3、histogram分組操作
histogram:類似于terms,也是進行bucket分組操作,接收一個field,按照這個field的值的各個范圍區(qū)間,進行bucket分組操作
"histogram":{
"field": "price",
"interval": 2000
},
interval:2000,劃分范圍,02000,20004000,40006000,60008000,8000~10000,buckets
去根據(jù)price的值,比如2500,看落在哪個區(qū)間內(nèi),比如20004000,此時就會將這條數(shù)據(jù)放入20004000對應的那個bucket中
bucket有了之后,一樣的,去對每個bucket執(zhí)行avg,count,sum,max,min,等各種metric操作,聚合分析
GET /tvs/_search
{
"size": 0,
"aggs": {
"price": {
"histogram": {
"field": "price",
"interval": 2000
},
"aggs": {
"revenue": {
"sum": {
"field": "price"
}
}
}
}
}
}
1.4、date histogram
date histogram:按照我們指定的某個date類型的日期field,以及日期interval,按照一定的日期間隔,去劃分bucket
date interval = 1m,
2017-01-01~2017-01-31,就是一個bucket
2017-02-01~2017-02-28,就是一個bucket
然后會去掃描每個數(shù)據(jù)的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中,一條數(shù)據(jù)都沒有,那么這個區(qū)間也是要返回的,不然默認是會過濾掉這個區(qū)間的
extended_bounds,min,max:劃分bucket的時候,會限定在這個起始日期,和截止日期內(nèi)
[fixed_interval] or [calendar_interval]
GET /tvs/_search
{
"size" : 0,
"aggs": {
"sales": {
"date_histogram": {
"field": "sold_date",
"calendar_interval": "month",
"format": "yyyy-MM-dd",
"min_doc_count" : 0,
"extended_bounds" : {
"min" : "2016-01-01",
"max" : "2017-12-31"
}
}
}
}
}