聚合提供了从你的数据中分组并萃取统计的能力。关于聚合的最简单的方法是将它大致等同于SQL组和SQL聚合函数。在Elasticsearch中,你可以执行搜索返回命中的结果,与此同时在同一个响应中返回聚合结果。在这个意义上这是非常强大和有效的,你可以使用简洁和简化的API在一次网络交互中完成查询和多个聚合操作。
首先,这个示例按state分组所有的account,然后返回按统计数(count)降序排列的前10个state。
GET /bank/_search { "aggs": { "group_by_state": { "terms": { "field": "state.keyword" } } }, "size": 0 }
在SQL中,上面的聚合在概念上类似:
SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC
返回:
{ "_shards": { "failed": 0, "successful": 5, "total": 5 }, "aggregations": { "group_by_state": { "buckets": [ { "doc_count": 27, "key": "ID" }, { "doc_count": 27, "key": "TX" }, { "doc_count": 25, "key": "AL" }, { "doc_count": 25, "key": "MD" }, { "doc_count": 23, "key": "TN" }, { "doc_count": 21, "key": "MA" }, { "doc_count": 21, "key": "NC" }, { "doc_count": 21, "key": "ND" }, { "doc_count": 20, "key": "ME" }, { "doc_count": 20, "key": "MO" } ], "doc_count_error_upper_bound": 20, "sum_other_doc_count": 770 } }, "hits": { "hits": [], "max_score": 0.0, "total": 1000 }, "timed_out": false, "took": 29 }
我们可以看到在ID(Idaho)中有27个账户,紧跟着是27个账号在TX(Texas),然后是25个账号在AL(Alabama),以此类推。
需要注意的是我们设置了size=0用来不显示search hits(搜索结果中的hits),因为我们只想看返回的聚合结果。
在前边的聚合基础上,下面的例子计算各州(state)的平局账户余额。(仅取按计数降序排列的前十个)。
GET /bank/_search { "aggs": { "group_by_state": { "aggs": { "average_balance": { "avg": { "field": "balance" } } }, "terms": { "field": "state.keyword" } } }, "size": 0 }
注意我们是如何将average_balance聚合嵌套在group_by_state聚合中的。这是所有聚合的通用模式。你可以在聚合中任意嵌套聚合用于萃取你所需的数据汇总。
基于前面的聚合,让我们根据余额平均数姜旭排列。
GET /bank/_search { "aggs": { "group_by_state": { "aggs": { "average_balance": { "avg": { "field": "balance" } } }, "terms": { "field": "state.keyword", "order": { "average_balance": "desc" } } } }, "size": 0 }
这个例子演示了如何通过年龄组(年龄20-29岁,30-39岁,40-49),然后通过性别,最后得到每个年龄段、每个性别的平均账户余额。
GET /bank/_search { "aggs": { "group_by_age": { "aggs": { "group_by_gender": { "aggs": { "average_balance": { "avg": { "field": "balance" } } }, "terms": { "field": "gender.keyword" } } }, "range": { "field": "age", "ranges": [ { "from": 20, "to": 30 }, { "from": 30, "to": 40 }, { "from": 40, "to": 50 } ] } } }, "size": 0 }
还有很多其他的聚合能力,我们在此不会展开讲解。如果你想进一步了解,可以参考:Aggregations reference guide
本文系本人根据官方文档的翻译,能力有限、水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸。
原文出处:https://www.elastic.co/guide/en/elasticsearch/reference/current/_executing_aggregations.html