天天看點

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

最後,我們還有一個需求需要完成:允許管理者在職員目錄中進行一些分析。 Elasticsearch有一個功能叫做聚合(aggregations),它允許你在資料上生成複雜的分析統計。它很像SQL中的<code>GROUP BY</code>但是功能更強大。

+

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

暫時先忽略文法隻看查詢結果:

我們可以看到兩個職員對音樂有興趣,一個喜歡林學,一個喜歡運動。這些資料并沒有被預先計算好,它們是實時的從比對查詢語句的文檔中動态計算生成的。如果我們想知道所有姓"Smith"的人最大的共同點(興趣愛好),我們隻需要增加合适的語句既可:

<code>all_interests</code>聚合已經變成隻包含和查詢語句相比對的文檔了:

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

雖然這次傳回的聚合結果有些複雜,但任然很容易了解:

3

該聚合結果比之前的聚合結果要更加豐富。我們依然得到了興趣以及數量(指具有該興趣的員勞工數)的清單,但是現在每個興趣額外擁有<code>avg_age</code>字段來顯示具有該興趣員工的平均年齡。

2

即使你還不了解文法,但你也可以大概感覺到通過這個特性可以完成相當複雜的聚合工作,你可以處理任何類型的資料。

為了掌握聚合aggs文法,你一定要了解兩個主要概念:

Buckets(桶):

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

Metrics(名額):

為某個桶中的文檔計算得到的統計資訊。

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

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

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

桶(Buckets)

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

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

一個聚合就是一些桶和名額的組合。一個聚合可以隻有一個桶,或者一個名額,或者每樣一個。在桶中甚至可以有多個嵌套的桶。比如,我們可以将文檔按照其所屬國家進行分桶,然後對每個桶計算其平均薪資(一個名額)。

因為桶是可以嵌套的,我們能夠實作一個更加複雜的聚合操作:

将文檔按照國家進行分桶。(桶)

然後将每個國家的桶再按照性别分桶。(桶)

然後将每個性别的桶按照年齡區間進行分桶。(桶)

最後,為每個年齡區間計算平均薪資。

大家一定要了解Buckets(桶)及Metrics(名額)概念,buckets多層嵌套的概念,想基于哪個桶做統計計算,隻需要嵌入一層aggs就可以了。

本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/bonelee/p/6344688.html,如需轉載請自行聯系原作者