聚合提供了分組並統計數據的能力。理解聚合的最簡單的方式是將其粗略地等同為SQL的GROUP BY和SQL聚合函數。在Elasticsearch中,你可以在一個響應中同時返回命中的數據和聚合結果。你可以使用簡單的API同時運行查詢和多個聚合,並以一次返回,這避免了來回的網絡通信,這是非常強大和高效的。
作為開始的一個例子,我們按照state分組,按照州名的計數倒序排序:
curl -XPOST 'localhost:9200/bank/_search?pretty' -d ' { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state" } } } }'
在SQL中,上面的聚合在概念上類似於:
SELECT COUNT(*) from bank GROUP BY state ORDER BY COUNT(*) DESC
響應(其中一部分)是:
"hits" : { "total" : 1000, "max_score" : 0.0, "hits" : [ ] }, "aggregations" : { "group_by_state" : { "buckets" : [ { "key" : "al", "doc_count" : 21 }, { "key" : "tx", "doc_count" : 17 }, { "key" : "id", "doc_count" : 15 }, { "key" : "ma", "doc_count" : 15 }, { "key" : "md", "doc_count" : 15 }, { "key" : "pa", "doc_count" : 15 }, { "key" : "dc", "doc_count" : 14 }, { "key" : "me", "doc_count" : 14 }, { "key" : "mo", "doc_count" : 14 }, { "key" : "nd", "doc_count" : 14 } ] } } }
我們可以看到AL(abama)有21個賬戶,TX有17個賬戶,ID(daho)有15個賬戶,依此類推。
注意我們將size設置成0,這樣我們就可以只看到聚合結果了,而不會顯示命中的結果。
在先前聚合的基礎上,現在這個例子計算了每個州的賬戶的平均余額(還是按照賬戶數量倒序排序的前10個州):
curl -XPOST 'localhost:9200/bank/_search?pretty' -d ' { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state" }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } } }'
注意,我們把average_balance聚合嵌套在了group_by_state聚合之中。這是所有聚合的一個常用模式。你可以任意的聚合之中嵌套聚合,這樣你就可以從你的數據中抽取出想要的概述。
基於前面的聚合,現在讓我們按照平均余額進行排序:
curl -XPOST 'localhost:9200/bank/_search?pretty' -d ' { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state", "order": { "average_balance": "desc" } }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } } }'
下面的例子顯示了如何使用年齡段(20-29,30-39,40-49)分組,然后在用性別分組,然后為每一個年齡段的每一個性別計算平均賬戶余額:
curl -XPOST 'localhost:9200/bank/_search?pretty' -d ' { "size": 0, "aggs": { "group_by_age": { "range": { "field": "age", "ranges": [ { "from": 20, "to": 30 }, { "from": 30, "to": 40 }, { "from": 40, "to": 50 } ] }, "aggs": { "group_by_gender": { "terms": { "field": "gender" }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } } } } }'