Elasticsearch-聚合
elasticsearch 聚合
概念:
大家都知道elasticsearch致力於查詢資料(海量資料)猶如大海里面怎麼撈針,es解決的就是大海撈針的方案。
聚合類似於DSL中的查詢表示式,
也有條件,組合,分類。
有兩個主要概念需要弄懂。
桶
指標
我們來看下這個(類比)
select count(person) from table group by country
桶:count(person),sum(person),max(person)
指標:group by country
桶:文件的集合:
國籍:中國桶,美國桶,日本桶
性別:男人桶,女人桶,兒童桶
ES 有很多的桶劃分方式:時間,年齡,地理位置,最受歡迎的詞語
指標:一種計算的標準
平均值,最大的,最小的,總數等。
組合:桶+指標
中國總人數
中國平均年薪
舉例
參考官網文件:
一個汽車4s店銷售的汽車
POST /cars/transactions/_bulk { "index": {}} { "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" } { "index": {}} { "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" } { "index": {}} { "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" } { "index": {}} { "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" } { "index": {}} { "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" } { "index": {}} { "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" } { "index": {}} { "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" } { "index": {}} { "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }
需求:我們想知道那種顏色的車銷量最好
curl -X GET "localhost:9200/cars/transactions/_search" -H 'Content-Type: application/json' -d'
{
"size" : 0,
"aggs" : {
"popular_colors" : {
"terms" : {
"field" : "color"
}
}
}
}
解析:size:0 size設定為0因為我們不需要知道查詢結果的具體內容只為了提高查詢速度。
aggs(完整:aggregations同樣有效)
桶:"terms" : { "field" : "color" }
指標:
"popular_colors"
我們建立了一個顏色桶,terms桶會為每個顏色建立一個新桶。
執行結果:
{
...
"hits": {
"hits": []
},
"aggregations": {
"popular_colors": {
"buckets": [
{
"key": "red",
"doc_count": 4
},
{
"key": "blue",
"doc_count": 2
},
{
"key": "green",
"doc_count": 2
}
]
}
}
}
上面我們可以想象成我們操作資料庫時,從資料庫中查詢銷量最好車的顏色。
由淺入深
(1)、嵌入指標
結合下面的例子理解
需求:我們想查詢每種顏色汽車的平均價格?
GET /cars/transactions/_search
{
"size" : 0,
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
結果:
{
...
"aggregations": {
"colors": {
"buckets": [
{
"key": "red",
"doc_count": 4,
"avg_price": {
"value": 32500
}
},
{
"key": "blue",
"doc_count": 2,
"avg_price": {
"value": 20000
}
},
{
"key": "green",
"doc_count": 2,
"avg_price": {
"value": 21000
}
}
]
}
}
...
}
從中我們就可以知道
紅車平均價格:32500
藍車平均價格:20000
綠車平均價格:21000
(2)、巢狀桶(桶中桶)
需求:我們想知道每種顏色的汽車製造商的分步?
仔細看一下桶和指標。
結果:`{
…
“aggregations”: {
“colors”: {
“buckets”: [
{
“key”: “red”,
“doc_count”: 4,
“make”: {
“buckets”: [
{
“key”: “honda”,
“doc_count”: 3
},
{
“key”: “bmw”,
“doc_count”: 1
}
]
},
“avg_price”: {
“value”: 32500
}
},
…
}`