1. 程式人生 > >ElasticSearch 聚合函數

ElasticSearch 聚合函數

metrics ted pop col 最小 函數 val max() curl

一、簡單聚合

:簡單來說就是滿足特定條件的文檔的集合。

指標:大多數 指標 是簡單的數學運算(例如最小值、平均值、最大值,還有匯總),這些是通過文檔的值來計算。

桶能讓我們劃分文檔到有意義的集合, 但是最終我們需要的是對這些桶內的文檔進行一些指標的計算。分桶是一種達到目的的手段:它提供了一種給文檔分組的方法來讓我們可以計算感興趣的指標。在實踐中,指標能讓你計算像平均薪資、最高出售價格、95%的查詢延遲這樣的數據。

例如,桶和指標可以類似映射成SQL查詢語句

SELECT COUNT(color) 技術分享  //相當於桶
FROM table
GROUP BY color 技術分享
//相當於指標

桶在概念上類似於 SQL 的分組(GROUP BY),而指標則類似於 COUNT()SUM()MAX() 等統計方法。

 1 curl -XGET ‘http://192.9.8.222:9200/wymlib/ym_literature/_search?pretty=true‘ -d  2 {
 3   "size": 0,
 4   "aggregations": {
 5     "popular_author": {
 6       "terms": {
 7         "field": "author"
 8       }
9 } 10 } 11 }‘
結果顯示: 
1
{ 2 "took" : 2803, 3 "timed_out" : false, 4 "_shards" : { 5 "total" : 5, 6 "successful" : 5, 7 "failed" : 0 8 }, 9 "hits" : { 10 "total" : 25, 11 "max_score" : 0.0, 12 "hits" : [ ] 13 }, 14 "aggregations" : { //1
15 "popular_author" : { //2 16 "doc_count_error_upper_bound" : 0, 17 "sum_other_doc_count" : 0, 18 "buckets" : [ { //3 19 "key" : "王陽明", 20 "doc_count" : 4 21 }, { 22 "key" : "陽明", 23 "doc_count" : 4 24 }, { 25 "key" : "胡", 26 "doc_count" : 2 27 }, { 28 "key" : "大大", 29 "doc_count" : 1 30 }, { 31 "key" : "建", 32 "doc_count" : 1 33 }, { 34 "key" : "徐", 35 "doc_count" : 1 36 }, { 37 "key" : "傑", 38 "doc_count" : 1 39 }, { 40 "key" : "闖", 41 "doc_count" : 1 42 } ] 43 } 44 } 45 }

//1 聚合操作被置於頂層參數 aggs 之下(如果你願意,完整形式 aggregations 同樣有效)。

//2 然後,可以為聚合指定一個我們想要名稱,本例中是: popular_colors

//3 最後,定義單個桶的類型 terms(這裏出現的是buckets)

註意:可能會註意到我們將 size 設置成 0 。我們並不關心搜索結果的具體內容,所以將返回記錄數設置為 0 來提高查詢速度。 設置 size: 0 與 Elasticsearch 1.x 中使用 count 搜索類型等價。

二、基於metric的聚合

因為不是特別了解,我暫且將它理解為基於指標的聚合,後面如果發現不對,再來改正。

 1 curl -XGET ‘http://192.9.8.222:9200/test_es_order_index/test_es_order_type/_search?pretty=true‘ -d  2 {
 3   "aggregations": {
 4     "sum_age": {
 5       "sum": {
 6         "field": "age"
 7       }
 8     }
 9   }
10 }‘

結果:(age 一個是29 一個是21求和後是50)

1 "aggregations" : {
2     "sum_age" : {
3       "value" : 50.0
4     }
5   }

stats統計:

 1 curl -XGET ‘http://192.9.8.222:9200/test_es_order_index/test_es_order_type/_search?pretty=true‘ -d  2 {
 3   "size":0,
 4   "aggregations": {
 5     "stats_age": {
 6       "stats": {
 7         "field": "age"
 8       }
 9     }
10   }
11 }‘

結果(請求後會直接顯示多種聚合結果):

 1 {
 2   "took" : 2,
 3   "timed_out" : false,
 4   "_shards" : {
 5     "total" : 5,
 6     "successful" : 5,
 7     "failed" : 0
 8   },
 9   "hits" : {
10     "total" : 7,
11     "max_score" : 0.0,
12     "hits" : [ ]
13   },
14   "aggregations" : {
15     "stats_age" : {
16       "count" : 2,
17       "min" : 21.0,
18       "max" : 29.0,
19       "avg" : 25.0,
20       "sum" : 50.0
21     }
22   }
23 }

【Reference】

【1】 http://www.cnblogs.com/xing901022/p/4947436.html

【2】 https://www.elastic.co/guide/cn/elasticsearch/guide/current/_aggregation_test_drive.html

【3】 http://www.cnblogs.com/xing901022/p/4944043.html

ElasticSearch 聚合函數