1. 程式人生 > >Elasticsearch-聚合

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
}
},


}`