es
中的聚合分析主要分為:
-
metric
:指標分析類型,如最值、平均值等等。 -
bucket
:分桶類型,類似group by
。 -
pipeline
:管道分析,基于上一級聚合分析結果進行再分析。
metric
min / max / sum / avg
min / max / sum / avg
分別用于統計最小值、最大值、求和、平均值:
GET /test/_search
{
"size": 0,
"aggs": {
"min_age": {
"min": {
"field": "age"
}
},
"max_age": {
"max": {
"field": "age"
}
},
"sum_age": {
"sum": {
"field": "age"
}
},
"avg_age": {
"avg": {
"field": "age"
}
}
}
}
cardinality
cardinality
用于獲取字段不同數值的個數,即 distinct count
:
GET /test/_search
{
"size": 0,
"aggs": {
"cardinality_age": {
"cardinality": {
"field": "age"
}
}
}
}
stats
stats
用于統計一系列指標,包括 min / max / sum / avg / count
:
GET /test/_search
{
"size": 0,
"aggs": {
"stats_age": {
"stats": {
"field": "age"
}
}
}
}
extended_stats
extended_stats
相對于 stats
提供更多指標,如方差、標準差等:
GET /test/_search
{
"size": 0,
"aggs": {
"stats_age": {
"extended_stats": {
"field": "age"
}
}
}
}
percentiles
percentiles
用于百分位統計,默認統計 1,5,25,50,75,95,99
分位點,通過 percents
參數可以指定要計算的分位點:
GET /test/_search
{
"size": 0,
"aggs": {
"percentiles_age": {
"percentiles": {
"field": "age",
"percents": [
50,
75,
95,
99
]
}
}
}
}
percentile_ranks
percentile_ranks
用于獲取指定數值對應的分位點,通過 values
參數指定:
GET /test/_search
{
"size": 0,
"aggs": {
"percentiles_ranks_age": {
"percentile_ranks": {
"field": "age",
"values": [
19
]
}
}
}
}
bucket
term
term
指按詞分桶,結果中的 buckets
會給出統計出的不同詞及對應的文檔個數。
GET /test/_search
{
"size": 0,
"aggs": {
"job": {
"terms": {
"field": "job.keyword",
"size": 10
}
}
}
}
// ...
"aggregations" : {
"job" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "c++",
"doc_count" : 2
},
{
"key" : "Java junior engineer",
"doc_count" : 1
},
{
"key" : "c",
"doc_count" : 1
},
{
"key" : "js",
"doc_count" : 1
}
]
}
}
// ..
通過使用 top_hits
能夠額外獲取每個桶中對應的文檔內容,支持排序:
GET /test/_search
{
"size": 0,
"aggs": {
"job": {
"terms": {
"field": "job.keyword",
"size": 10
},
"aggs": {
"top": {
"top_hits": {
"size": 10,
"sort": [
"birth"
]
}
}
}
}
}
}
range
range
指定數值范圍來設定分桶規則,支持使用 key
參數指定聚合結果名稱:
GET /test/_search
{
"size": 0,
"aggs": {
"age_range": {
"range": {
"field": "age",
"ranges": [
{
"key": "lt 20",
"to": 20
},
{
"from": 20,
"to": 30
},
{
"key": "gt 30",
"from": 30
}
]
}
}
}
}
range
同樣支持日期類的范圍統計,通過 format
參數指定返回的日期格式:
GET /test/_search
{
"size": 0,
"aggs": {
"birth_range": {
"range": {
"field": "birth",
"format": "yyyy",
"ranges": [
{
"to": 1990
},
{
"from": 1990,
"to": 2000
},
{
"from": 2000
}
]
}
}
}
}
historgram
historgram
用以指定間隔分隔數據,interval
參數指定間隔大小,extended_bounds
參數指定間隔分隔的范圍:
GET /test/_search
{
"size": 0,
"aggs": {
"age_histogram": {
"histogram": {
"field": "age",
"interval": 5,
"extended_bounds": {
"min": 0,
"max": 100
}
}
}
}
}
date_histogram
date_histogram
是針對日期間隔的統計:
GET /test/_search
{
"size": 0,
"aggs": {
"birth_date_histogram": {
"date_histogram": {
"field": "birth",
"calendar_interval": "year",
"format": "yyyy"
}
}
}
}
pipeline
pipeline
針對聚合統計結果進行再分析,通過 buckets_path
參數指定需要再分析的指標:
GET /test/_search
{
"size": 0,
"aggs": {
"job": {
"terms": {
"field": "job.keyword",
"size": 10
},
"aggs": {
"avg_age": {
"avg": {
"field": "age"
}
}
}
},
"max_avg_age_by_job": {
"max_bucket": {
"buckets_path": "job>avg_age"
}
}
}
}
作用范圍
聚合分析默認作用范圍是 query
查詢語句的結果集,es
提供一系列方式改變聚合分析的作用范圍。
為某個聚合分析設定過濾條件
先使用 filter
指定當前聚合分析的過濾條件,在子查詢中輸入真正的聚合語句:
GET /test/_search
{
"size": 0,
"aggs": {
"age_over20_job": {
"filter": {
"range": {
"age": {
"gte": 20
}
}
},
"aggs": {
"job": {
"terms": {
"field": "job.keyword",
"size": 10
}
}
}
}
}
}
聚合分析后過濾
如果需要在聚合分析出全部結果后控制返回的文檔結果,可以使用 post_filter
來做過濾。
GET /test/_search
{
"size": 10,
"aggs": {
"job": {
"terms": {
"field": "job.keyword",
"size": 10
}
}
},
"post_filter": {
"match": {
"age": "18"
}
}
}
忽略 query
如果需要忽略 query
對聚合分析的影響,通過 global
參數指定無視 query
過濾條件,基于全部文檔進行分析,并在子查詢中輸入真正的聚合語句。
GET /test/_search
{
"query": {
"match": {
"job.keyword": "js"
}
},
"size": 10,
"aggs": {
"all": {
"global": {},
"aggs": {
"job": {
"terms": {
"field": "job.keyword",
"size": 10
}
}
}
}
}
}
排序
聚合分析中的排序默認是按各統計結果的數量倒序排序的,同時可以指定子查詢結果作為排序依據:
GET /test/_search
{
"size": 0,
"aggs": {
"job": {
"terms": {
"field": "job.keyword",
"size": 10,
"order": {
"avg_age": "asc"
}
},
"aggs": {
"avg_age": {
"avg": {
"field": "age"
}
}
}
}
}
}
聚合精準度問題
對于 terms
類型的聚合,每個分片會按數量倒序排序后返回前 size
個結果,在整合時可能會導致不準確。聚合分析結果有兩個指標說明潛在的遺漏問題:
-
doc_count_error_upper_bound
:各分片被遺漏的term
的最大值的總和。 -
sum_other_doc_count
:各分片返回的未被最終結果使用的其它聚合統計總數。
shard_size
shard_size
參數用于指定分片實際返回的統計指標數量,默認為 size * 1.5 + 10
。通過調整 shard_size
可以盡量減小聚合統計的誤差。