一、简介
1、什么是ES聚合分析?
聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于 SQL GROUP BY 和 SQL 聚合函数。
聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值、最小值,计算和、平均值等。ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。
对一个数据集求最大、最小、和、平均值等指标的聚合,在ES中称为指标聚合 metric。
而关系型数据库中除了有聚合函数外,还可以对查询出的数据进行分组group by,再在组上进行指标聚合。在 ES 中group by 称为分桶,桶聚合 bucketing。
ES中还提供了矩阵聚合(matrix)、管道聚合(pipleline),但还在完善中。
2、ES聚合分析查询写法
在查询请求体中以 aggregations 节点按如下语法定义聚合分析:
"aggregations" : {"<aggregation_name>" : {"<aggregation_type>" : {<aggregation_body>}[,"meta" : { [<meta_data_body>] } ]?[,"aggregations" : { [<sub_aggregation>]+ } ]?}[,"<aggregation_name_2>" : { ... } ]*}说明:aggregations 也可简写为 aggs3. 聚合分析的值来源#聚合计算的值可以取字段的值,也可是脚本计算的结果。二、指标聚合#1. max min sum avg#示例1:查询所有客户中余额的最大值POST /bank/_search?{"size": 0,"aggs": {"masssbalance": {"max": {"field": "balance"}}}}结果1:{"took": 2080,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 1000,"max_score": 0,"hits": []},"aggregations": {"masssbalance": {"value": 49989}}}示例2:值来源于脚本,查询所有客户的平均年龄是多少,并对平均年龄加10POST /bank/_search?size=0{"aggs": {"avg_age": {"avg": {"script": {"source": "doc.age.value"}}},"avg_age10": {"avg": {"script": {"source": "doc.age.value + 10"}}}}}结果2:{"took": 86,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 1000,"max_score": 0,"hits": []},"aggregations": {"avg_age": {"value": 30.171},"avg_age10": {"value": 40.171}}}三、桶聚合#fileTerms Aggregation 根据字段值项分组聚合示例1:POST /bank/_search?size=0{"aggs": {"age_terms": {"terms": {"field": "age"}}}}结果:{"took": 2000,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 1000,"max_score": 0,"hits": []},"aggregations": {"age_terms": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 463,"buckets": [{"key": 31,"doc_count": 61},{"key": 39,"doc_count": 60},{"key": 26,"doc_count": 59},{"key": 32,"doc_count": 52},{"key": 35,"doc_count": 52},{"key": 36,"doc_count": 52},{"key": 22,"doc_count": 51},{"key": 28,"doc_count": 51},{"key": 33,"doc_count": 50},{"key": 34,"doc_count": 49}]}}}
