ES聚合使用

一. 聚合查询分类:

聚合方式

说明

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索引新增字段时,切记先给索引加好字段再写数据
点赞
收藏

评论区

加载中...

相关推荐

SQL中的函数

概括:函数是由一个或多个TSQL语句组成的子程序,是一组可用于封闭实现一定功能的程序代码,函数使代码便于重复使用。类别:1、聚合函数聚合函数对一个组值执行计算,并返回单个值。除了COUNT以外,聚合函数都会忽略空置。聚合函数经常与SELECT语句的GROUPBY字句一起使用。常用的聚合函数包括AVC、COUNT、MA

表的纵横表变换

​在我们平时使用数据库时,经常会发现有的表列数过多,为了提高效率,我们经常对要查询的表来纵横表变换。一.行转列1.PIVOT函数PIVOT(任意聚合函数 FOR 列名 IN(类型))    其中,【聚合函数】聚合的字段,是需要转化为列值的字段;【列名】是需要转化为列标识的字段,【类型】即是需要的结果展示,【类型】中可以指定别名; IN中还可以

ElasticSearch

在Mysql中,我们可以获取一组数据的 最大值(Max)、最小值(Min)。同样我们能够对这组数据进行 分组(Group)。那么对于Elasticsearch中我们也可以实现同样的功能,聚合有关资料官方文档内容较多,这里大概分3篇或者4篇博客写这个有关Elasticsearch聚合。官方对聚合有四个关键字:

Django Mysql数据库

一、聚合查询与分组查询(很重要!!!)聚合查询:aggregate(\args, \\kwargs),只对一个组进行聚合fromdjango.db.modelsimportAvg,Sum,Count,Max,Min1、查询所有图书的平均价格print(models.Book.obje

ES Pipeline Aggregation(管道聚合)

微信公众号:\中间件兴趣圈\关于作者:《RocketMQ技术内幕》作者;管道聚合处理来自其他聚合而不是文档集的输出,将信息添加到输出树中。注:关于脚本聚合目前在本文中暂时不会涉及。主要有如下两种管道聚合方式:parentsibling下面一一介绍ES定义的管道聚合。

Es Bucket聚合(桶聚合) Terms Aggregation与Significant Terms Aggregation

微信公众号:\中间件兴趣圈\关于作者:《RocketMQ技术内幕》作者;本章将介绍elasticsearch最重要的桶聚合termsaggregation。TermsAggregation多值聚合,根据库中的文档动态构建桶。基于词根的聚合,如果聚合字段是text的话,会对一个一个的词根进行聚合,通常不会在te