摘要: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 } } }