elasticsearch聚合操做——本質就是針對搜索後的結果使用桶bucket(容許嵌套)進行group by,統計下分組結果,包括min/max/avg

分析

最後,咱們還有一個需求須要完成:容許管理者在職員目錄中進行一些分析。 Elasticsearch有一個功能叫作聚合(aggregations),它容許你在數據上生成複雜的分析統計。它很像SQL中的GROUP BY可是功能更強大。spa

+

 

舉個例子,讓咱們找到全部職員中最大的共同點(興趣愛好)是什麼:rest

GET /megacorp/employee/_search
{
  "aggs": { "all_interests": { "terms": { "field": "interests" } } } } 

暫時先忽略語法只看查詢結果:code

{
   ...
   "hits": { ... }, "aggregations": { "all_interests": { "buckets": [ { "key": "music", "doc_count": 2 }, { "key": "forestry", "doc_count": 1 }, { "key": "sports", "doc_count": 1 } ] } } } 

咱們能夠看到兩個職員對音樂有興趣,一個喜歡林學,一個喜歡運動。這些數據並無被預先計算好,它們是實時的從匹配查詢語句的文檔中動態計算生成的。若是咱們想知道全部姓"Smith"的人最大的共同點(興趣愛好),咱們只須要增長合適的語句既可:ip

GET /megacorp/employee/_search
{
  "query": { "match": { "last_name": "smith" } }, "aggs": { "all_interests": { "terms": { "field": "interests" } } } } 

all_interests聚合已經變成只包含和查詢語句相匹配的文檔了:文檔

...
  "all_interests": { "buckets": [ { "key": "music", "doc_count": 2 }, { "key": "sports", "doc_count": 1 } ] } 

聚合也容許分級彙總。例如,讓咱們統計每種興趣下職員的平均年齡:string

GET /megacorp/employee/_search
{
    "aggs" : { "all_interests" : { "terms" : { "field" : "interests" }, "aggs" : { "avg_age" : { "avg" : { "field" : "age" } } } } } } 

雖然此次返回的聚合結果有些複雜,但任然很容易理解:it

3

 

...
  "all_interests": { "buckets": [ { "key": "music", "doc_count": 2, "avg_age": { "value": 28.5 } }, { "key": "forestry", "doc_count": 1, "avg_age": { "value": 35 } }, { "key": "sports", "doc_count": 1, "avg_age": { "value": 25 } } ] } 

該聚合結果比以前的聚合結果要更加豐富。咱們依然獲得了興趣以及數量(指具備該興趣的員工人數)的列表,可是如今每一個興趣額外擁有avg_age字段來顯示具備該興趣員工的平均年齡。io

2

 

即便你還不理解語法,但你也能夠大概感受到經過這個特性能夠完成至關複雜的聚合工做,你能夠處理任何類型的數據。ast

 

爲了掌握聚合aggs語法,你必定要了解兩個主要概念:class

Buckets(桶):

知足某個條件的文檔集合。

Metrics(指標):

爲某個桶中的文檔計算獲得的統計信息。

就是這樣!每一個聚合只是簡單地由一個或者多個桶,零個或者多個指標組合而成。


桶和SQL中的組(Grouping)擁有類似的概念,而指標則與COUNT(),SUM(),MAX(),MIN(), AVG()等類似。

讓咱們仔細看看這些概念。

桶(Buckets)

一個桶就是知足特定條件的一個文檔集合:

一名員工要麼屬於男性桶,或者女性桶。

 

一個聚合就是一些桶和指標的組合。一個聚合能夠只有一個桶,或者一個指標,或者每樣一個。在桶中甚至能夠有多個嵌套的桶。好比,咱們能夠將文檔按照其所屬國家進行分桶,而後對每一個桶計算其平均薪資(一個指標)。

由於桶是能夠嵌套的,咱們可以實現一個更加複雜的聚合操做:

將文檔按照國家進行分桶。(桶)
而後將每一個國家的桶再按照性別分桶。(桶)
而後將每一個性別的桶按照年齡區間進行分桶。(桶)
最後,爲每一個年齡區間計算平均薪資。

你們必定要理解Buckets(桶)及Metrics(指標)概念,buckets多層嵌套的概念,想基於哪一個桶作統計計算,只須要嵌入一層aggs就能夠了。

相關文章
相關標籤/搜索