一. 聚合查询分类:
聚合方式
说明
Metric Aggregation(指标聚合)
一些数学计算,可以对文档字段统计分析
Bucket Aggregation (桶聚合)
一些满足特定条件的文档的集合
Pipeline Aggregation(管道聚合)
对其他的聚合结果进行二次聚合
Metrix Aggregation(矩阵聚合)
支持对多个字段的操作并提供一个结果矩阵
查询请求体语法:
“aggs" : {
“{aggs_name}" : { //聚合的名字 “{aggs_type}" : { //聚合的类型 {aggs_body} //聚合体:对哪些字段进行聚合 }
[,“aggs” : { [<sub_aggs>]+ } ] //可定义子聚合
}
[,“<aggs_name_2>” : { ... } ] //可定义多个同级聚合
}
二. ES聚合
1.指标查询:
- max,min,sum,avg,count,distinct
- 统计聚合,拓展的统计聚合:
- 百分比聚合,百分比排名聚合:
- 最高匹配聚合,
- 地理边界聚合 & 地理重心聚合,针对geo-point类型字段
示例 -max,min,sum,avg,count,distinct :
1最大值: 2{ 3 "size":0, 4 "aggs":{ 5 "flowAmount_max":{ 6 "max":{ 7 "field":"age" 8 } 9 } 10 } 11} 12 13 14count(字段有值的数量): 15{ 16 "size":0, 17 "aggs":{ 18 "users_count":{ 19 "value_count":{ 20 "field":"username" 21 } 22 } 23 } 24} 25 26 27去重: 28{ 29 "size":0, 30 "aggs":{ 31 "labels_cardinality":{ 32 "cardinality":{ 33 "field":"labels" 34 } 35 } 36 } 37}
示例 - 统计聚合,拓展的统计聚合:
1统计聚合(count,min,max,avg,sum): 2{ 3 "size":0, 4 "aggs":{ 5 "flowAmount_stats":{ 6 "stats":{ 7 "field":"amount" 8 } 9 } 10 } 11} 12 13 14 15 16拓展统计聚合(在stats基础上加了平方和,方差,标准差等): 17{ 18 "size":0, 19 "aggs":{ 20 "flowAmount_extended_stats":{ 21 "extended_stats":{ 22 "field":"amount" 23 } 24 } 25 } 26} 27
示例 - 百分比聚合,百分比排名聚合:
1百分比聚合: 2{ 3 "size":0, 4 "aggs":{ 5 “createTime_percentiles":{ 6 "percentiles":{ 7 "field":"createTime", 8 "percents": [ 9 1, 10 5, 11 25, 12 50, 13 75, 14 95, 15 99, 16 99.9 17 ] 18 } 19 } 20 } 21} 22 23 24 25 26百分比排名聚合: 27{ 28 "size":0, 29 "aggs":{ 30 “flowAmount_percentiles_ranks":{ 31 "percentile_ranks":{ 32 "field":"salesAmount", 33 "values": [ 34 5, 35 10 36 ] 37 } 38 } 39 } 40}
示例 - 最高匹配聚合:
1最高匹配聚合: 2{ 3 "size": 0, 4 "aggs": { 5 "top_tags": { 6 "terms": { 7 "field": "flowAmount", 8 "size": 10 9 }, 10 "aggs": { 11 "flowAmount_top_hits": { 12 "top_hits": { 13 "sort": [ 14 { 15 "id": { 16 "order": "desc" 17 } 18 } 19 ], 20 "_source": { 21 "includes": 22 [ 23 "id", "state", "flowAmount", "createTime" 24 ] 25 }, 26 "size" : 2 27 } 28 } 29 } 30 } 31 } 32}
2. 桶聚合:
- Terms –词聚合
- Filter – 过滤聚合
- Filters – 多过滤聚合
- Range – 范围聚合
- Date Range – 时间范围聚合
- Histogram – 时间柱状聚合
- Missing – 缺省值聚合
- IP Range – IP 范围聚合(IPV4)
- Nested – 嵌套聚合
示例 - Terms –词聚合,Filter – 过滤聚合,Filters – 多过滤聚合:
1Terms过滤: 2{ 3 "size": 0, 4 "aggs": { 5 "labels_terms" : { 6 "terms" : { 7 "field" : "username", 8 "size" : 10, 9 "order": { 10 "_count": "desc" 11 }, 12 "min_doc_count": 300 13 } 14 } 15 } 16} 17 18 19 20 21 22 23Filter过滤: 24{ 25 "size": 0, 26 "aggs": { 27 "responseTime_filter": { 28 "filter": { 29 "match":{ 30 "state":"FINISHED" 31 } 32 }, 33 "aggs": { 34 "responseTime_avg": { 35 "avg": { 36 "field": "resolvedTime" 37 } 38 } 39 } 40 } 41 } 42} 43 44 45 46 47多过滤聚合: 48{ 49 "size": 0, 50 "aggs": { 51 "messages": { 52 "filters": { 53 "filters": { 54 "state_match": { 55 "match": { 56 "state": "FINISHED" 57 } 58 }, 59 "lables_match": { 60 "match": { 61 "lables": "TEST_ISSUE" 62 } 63 } 64 } 65 } 66 } 67 } 68}
示例 - Range – 范围聚合,Date Range – 时间范围聚合:
1范围聚合: 2{ 3 "size": 0, 4 "aggs": { 5 "age_range": { 6 "range": { 7 "field": "flowAmount", 8 "ranges": [ 9 { 10 "to": 1 11 }, 12 { 13 "from": 1, 14 "to": 5 15 }, 16 { 17 "from": 5, 18 "to": 10 19 }, 20 { 21 "from": 10 22 } 23 ] 24 }, 25 "aggs": { 26 "createTime_max": { 27 "max": { 28 "field": "createTime" 29 } 30 } 31 } 32 } 33 } 34} 35 36 37 38时间范围聚合(基于日期类型): 39{ 40 "size":0, 41 "aggregations":{ 42 "splitCreateTime":{ 43 "date_range":{ 44 "field":“dateTime", 45 "format":"yyyy-MM-dd", 46 "time_zone": "+08:00", 47 "interval": "day", 48 "ranges":[ 49 { 50 "from":2020-10-14, 51 "to":2020-10-15 52 }, 53 { 54 "from":2020-10-15, 55 "to":2020-10-16 56 }, 57 { 58 "from":2020-10-16, 59 "to":2020-10-17 60 } 61 ] 62 } 63}
示例 - Histogram – 时间柱状聚合,Missing – 缺省值聚合:
1柱状图: 2{ 3 "size": 0, 4 "aggs" : { 5 "flowAmount_hisgogram" : { 6 "histogram" : { 7 "field" : "flowAmount", 8 "interval" : 5, 9 "min_doc_count" : 1, 10 "extended_bounds" : { 11 "min" : 0, 12 "max" : 50 13 }, 14 "order" : { "_count" : "desc" }, 15 "keyed":true, 16 "missing":0 17 } 18 } 19 } 20} 21 22 23 24日期直方图(基于日期类型); 25{ 26 "size": 0, 27 "aggs" : { 28 "dateTime_histogram" : { 29 "date_histogram" : { 30 "field" : "dateTime", 31 "interval" : "day", 32 "format" : "yyyy-MM-dd", 33 "time_zone": "+08:00" 34 } 35 } 36 } 37} 38 39 40 41缺省值聚合: 42{ 43 "size": 0, 44 "aggs" : { 45 "resolvedTime_missing" : { 46 "missing" : { 47 "field" : "resolvedTime" 48 } 49 } 50 } 51}
示例 - IP Range – IP 范围聚合(IPV4),Nested – 嵌套聚合:
1IPV4范围聚合(基于IPv4 数据类型): 2{ 3 "size": 0, 4 "aggs" : { 5 "ipv4_ranges" : { 6 "ip_range" : { 7 "field" : "ipv4", 8 "ranges" : [ 9 { "to" : "10.0.0.10" }, 10 { "from" : "10.0.0.10" } 11 ] 12 } 13 } 14 } 15} 16 17 18 19嵌套聚合(基于nested类型); 20{ 21 "size": 0, 22 "aggs": { 23 "age_range": { 24 "range": { 25 "field": "historyLog.operateTime", 26 "ranges": [ 27 { 28 "to": 1602259200000 29 }, 30 { 31 "from": 1602259200000, 32 "to": 1603123200000 33 }, 34 { 35 "from": 1603123200000 36 } 37 ] 38 } 39 } 40 } 41} 42 43
3.管道聚合:
处理来自其他聚合而不是文档集的输出,将信息添加到输出中。bucket_path指定请求指标的路径
示例 - 管道聚合:
1{ 2 "size":0, 3 "aggs":{ 4 "flowAmount_range":{ 5 "range":{ 6 "field":"createTime", 7 "ranges":[ 8 { 9 "to": 1602259200000 10 }, 11 { 12 "from": 1602259200000, 13 "to": 1603123200000 14 }, 15 { 16 "from": 1603123200000, 17 "to": 1603987200000 18 }, 19 { 20 "from": 1603987200000 21 } 22 ] 23 }, 24 "aggs":{ 25 "resolvedTime_sum":{ 26 "sum":{ 27 "field":"resolvedTime" 28 } 29 } 30 } 31 }, 32 "resolvedTime_avg":{ 33 "avg_bucket":{ 34 "buckets_path":"flowAmount_range>resolvedTime_sum" 35 } 36 } 37 } 38}
三. 使用注意事项:
- 查询时,可根据具体业务场景过滤字段,提高效率,可使用fetchSource
- 历史数据批量写入时,配置refresh_interval参数,减少刷新频率(memory->doc)。
- 查询时,可通过配置max_result_window控制最大查询数量
- 使用scroll时,可配置max_open_scroll_context控制scrollId的容量,每次scroll完需要clearScroll
- 原有ES索引新增字段时,切记先给索引加好字段再写数据