摘要:ES指标聚合,就是类似SQL的统计函数,指标聚合可以单独使用,也可以跟桶聚合一起使用,常用的统计函数如下:Value Count - 类似sql的count函数,统计总数,Cardinality - 类似SQL的count(DISTINCT 字段)...
ES指标聚合,就是类似SQL的统计函数,指标聚合可以单独使用,也可以跟桶聚合一起使用,常用的统计函数如下:
Value Count - 类似sql的count函数,统计总数
Cardinality - 类似SQL的count(DISTINCT 字段), 统计不重复的数据总数
Avg - 求平均值
Sum - 求和
Max - 求最大值
Min - 求最小值
1. Value Count
ES值聚合,主要用于统计文档总数,类似SQL的count函数,例子:
POST /sales/_search?size=0 { "aggs": { "types_count": { // 聚合查询的名字,随便取个名字 "value_count": { // 聚合类型为:value_count "field": "type" // 计算type这个字段值的总数 } } } }
等价SQL:
select count(type) from sales
返回结果:
{ ... "aggregations": { "types_count": { // 聚合查询的名字 "value": 7 // 统计结果 } } }
2.Cardinality
基数聚合,也是用于统计文档的总数,跟Value Count的区别是,基数聚合会去重,不会统计重复的值,类似SQL的count(DISTINCT 字段)用法,例子:
POST /sales/_search?size=0 { "aggs" : { "type_count" : { // 聚合查询的名字,随便取一个 "cardinality" : { // 聚合查询类型为:cardinality "field" : "type" // 根据type这个字段统计文档总数 } } } }
等价SQL:
select count(DISTINCT type) from sales
返回结果:
{ ... "aggregations" : { "type_count" : { // 聚合查询的名字 "value" : 3 // 统计结果 } } }
提示:前面提到基数聚合的作用等价于SQL的count(DISTINCT 字段)的用法,其实不太准确,因为SQL的count统计结果是精确统计不会丢失精度,但是ES的cardinality基数聚合统计的总数是一个近似值,会有一定的误差,这么做的目的是为了性能,因为在海量的数据中精确统计总数是非常消耗性能的,但是很多业务场景不需要精确的结果,只要近似值,例如:统计网站一天的访问量,有点误差没关系。
3.Avg (求平均值)
POST /exams/_search?size=0 { "aggs": { "avg_grade": { // 聚合查询名字,随便取一个名字 "avg": { // 聚合查询类型为: avg "field": "grade" // 统计grade字段值的平均值 } } } }
返回结果:
{ ... "aggregations": { "avg_grade": { // 聚合查询名字 "value": 75.0 // 统计结果 } } }
4.Sum (求和计算)
POST /sales/_search?size=0 { "aggs": { "hat_prices": { // 聚合查询名字,随便取一个名字 "sum": { // 聚合类型为:sum "field": "price" // 计算price字段值的总和 } } } }
返回结果:
{ ... "aggregations": { "hat_prices": { // 聚合查询名字 "value": 450.0 // 统计结果 } } }
5.Max (求最大值)
POST /sales/_search?size=0 { "aggs": { "max_price": { // 聚合查询名字,随便取一个名字 "max": { // 聚合类型为:max "field": "price" // 求price字段的最大值 } } } }
返回结果:
{ ... "aggregations": { "max_price": { // 聚合查询名字 "value": 200.0 // 最大值 } } }
6.Min (求最小值)
POST /sales/_search?size=0 { "aggs": { "min_price": { // 聚合查询名字,随便取一个 "min": { // 聚合类型为: min "field": "price" // 求price字段值的最小值 } } } }
返回结果:
{ ... "aggregations": { "min_price": { // 聚合查询名字 "value": 10.0 // 最小值 } } }
7.多个分组条件
POST /exams/_search?size=0 { "size": 0, "query": { "bool": { "should": [ { "wildcard": { "Url.keyword": "*.yzmcms.com*" } }, { "wildcard": { "Site.keyword": "*.yzmcms.com*" } }, { "wildcard": { "Host.keyword": "*.yzmcms.com*" } } ] } }, "aggs": { "urls": { "terms": { "field": "Url.keyword", "size": 1000 } }, "sites": { "terms": { "field": "Site.keyword", "size": 1000 } }, "hosts": { "terms": { "field": "Host.keyword", "size": 1000 } } } }
返回结果:
{ ... "aggregations": { "urls": { // 聚合查询名字 "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": { ... }, }, "sites": { // 聚合查询名字 "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": { ... }, }, "hosts": { // 聚合查询名字 "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": { ... }, } } }
8.综合例子
前面的例子,仅仅介绍聚合指标单独使用的情况,实际应用中经常先通过query查询,搜索索引中的数据,然后对query查询的结果进行统计分析,例子:
POST /sales/_search { "size": 0, // size = 0,代表不想返回query查询结果,只要统计结果 "query": { // 设置query查询条件,后面的aggs统计,仅对query查询结果进行统计 "constant_score": { "filter": { "match": { "type": "hat" } } } }, "aggs": { // 统计query查询结果, 默认情况如果不写query语句,则代表统计所有数据 "hat_prices": { // 聚合查询名字,计算price总和 "sum": { "field": "price" } }, "min_price": { // 聚合查询名字,计算price最小值 "min": { "field": "price" } }, "max_price": { // 聚合查询名字,计算price最大值 "max": { "field": "price" } } } }
返回结果:
{ ... "aggregations": { "hat_prices": { // 求和 "value": 450.0 }, "min_price": { // 最小值 "value": 10.0 }, "max_price": { // 最大值 "value": 200.0 } } }