文章目錄
- 基礎知識
-
- 案例
基礎知識
bucket 其實就是分組 相當于msql 中 group by
metric 就是統計 相當于 mysql 中的count
案例
以一個家電賣場中的電視銷售資料為背景,來對各種品牌,各種顔色的電視的銷量和銷售額,進行各種各樣角度的分析
GET /tvs/sales/_search
{
"size": 0,
"aggs": {
"ppp": {
"terms": {
"field": "color"
}
}
}
}
size:0 隻擷取統計之後的結果,統計用到的原始資料不顯示
aggs:固定文法聚合統計的标志
ppp:為聚合後的字段随便起一個名字
terms:需要分組的字段
對每種顔色的家電求平均值
GET /tvs/sales/_search
{
"size": 0,
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
根據color分bucket之後 每個bucket再求平均值
在第一個aggs 裡面 平級的json結購再添加一個aggs
每種顔色的平均價格,以及找到每種顔色每個品牌的平均價格
我們可以進行多層次的下鑽
比如說,現在紅色的電視有4台,同時這4台電視中,有3台是屬于長虹的,1台是屬于小米的
紅色電視中的3台長虹的平均價格是多少?
紅色電視中的1台小米的平均價格是多少?
GET /tvs/sales/_search
{
"size": 0,
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
},
"group_brand":{
"terms": {
"field": "brand"
},
"aggs": {
"b_avg_p": {
"avg": {
"field": "price"
}
}
}
}
}
}
}
}
一次bucket之後多次metric 多次計算 取最大 最小 平均 求和
GET /tvs/sales/_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" } }
}
}
}
}
histogram:區間分組,0-2000 ,2000-4000 來分組
統計各個價格區間内的家電的銷售總和
GET /tvs/sales/_search
{
"size": 0,
"aggs": {
"price": {
"histogram": {
"field": "price",
"interval": 2000
},
"aggs": {
"revenue": {
"sum": {
"field": "price"
}
}
}
}
}
}
date histogram,按照我們指定的某個date類型的日期field,以及日期interval,按照一定的日期間隔,去劃分bucket
GET /tvs/sales/_search
{
"size" : 0,
"aggs": {
"sales": {
"date_histogram": {
"field": "sold_date",
"interval": "month",
"format": "yyyy-MM-dd",
"min_doc_count" : 0,
"extended_bounds" : {
"min" : "2016-01-01",
"max" : "2017-12-31"
}
}
}
}
}
min_doc_count:即使某個日期interval,2017-01-01~2017-01-31中,一條資料都沒有,那麼這個區間也是要傳回的,不然預設是會過濾掉這個區間的
extended_bounds,min,max:劃分bucket的時候,會限定在這個起始日期,和截止日期内
歡迎大家關注我的微信公衆号 您的關注就是我不懈的動力