最後,咱們還有一個需求須要完成:容許管理者在職員目錄中進行一些分析。 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
...
"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
即便你還不理解語法,但你也能夠大概感受到經過這個特性能夠完成至關複雜的聚合工做,你能夠處理任何類型的數據。ast
爲了掌握聚合aggs語法,你必定要了解兩個主要概念:class
Buckets(桶):
知足某個條件的文檔集合。
Metrics(指標):
爲某個桶中的文檔計算獲得的統計信息。
就是這樣!每一個聚合只是簡單地由一個或者多個桶,零個或者多個指標組合而成。
桶和SQL中的組(Grouping)擁有類似的概念,而指標則與COUNT(),SUM(),MAX(),MIN(), AVG()等類似。
讓咱們仔細看看這些概念。
桶(Buckets)
一個桶就是知足特定條件的一個文檔集合:
一名員工要麼屬於男性桶,或者女性桶。
一個聚合就是一些桶和指標的組合。一個聚合能夠只有一個桶,或者一個指標,或者每樣一個。在桶中甚至能夠有多個嵌套的桶。好比,咱們能夠將文檔按照其所屬國家進行分桶,而後對每一個桶計算其平均薪資(一個指標)。
由於桶是能夠嵌套的,咱們可以實現一個更加複雜的聚合操做:
將文檔按照國家進行分桶。(桶)
而後將每一個國家的桶再按照性別分桶。(桶)
而後將每一個性別的桶按照年齡區間進行分桶。(桶)
最後,爲每一個年齡區間計算平均薪資。
你們必定要理解Buckets(桶)及Metrics(指標)概念,buckets多層嵌套的概念,想基於哪一個桶作統計計算,只須要嵌入一層aggs就能夠了。