Elasticsearch 的 REST APIs:聚合查询
摘要
-
本文介绍 Elasticsearch 的 REST APIs:聚合查询
-
Elasticsearch版本8.17.3
- Elasticsearch 的 REST APIs
聚合查询
-
聚合查询,可以让我们极其方便的实现对索引数据的统计、分析、运算等操作。
-
基本语法包括以下部分:
- 查询条件:指定需要聚合的文档,可以使用标准的 Elasticsearch 查询语法,如 term、match、range 等等。
- 聚合函数:指定要执行的聚合操作,如 sum、avg、min、max、terms、date_histogram 等等。每个聚合命令都会生成一个聚合结果。
- 聚合嵌套:聚合命令可以嵌套,以便更细粒度地分析数据。
1 | GET <index_name>/_search |
-
聚合的分类
- Metric Aggregation:—些数学运算,可以对文档字段进行统计分析,类比Mysql中的 min(), max(), sum() 操作。
- Bucket Aggregation:一些满足特定条件的文档的集合放置到一个桶里,每一个桶关联一个key,类比Mysql中的group by操作。
- Pipeline Aggregation:对其他的聚合结果进行二次聚合
示例数据准备
-
我们需要先准备一些数据,才能进行聚合分析。
-
创建索引
1 | # 如果存在先删除 |
Metric Aggregation(指标聚合)
单值分析︰只输出一个分析结果
-
min, max, avg, sum
1 | # 最大值、最小值、平均值、总和 |
-
Cardinality(类似distinct Count)
1 | GET /shopping/_search |
多值分析:输出多个分析结果
-
stats(统计), extended stats
1 | GET /shopping/_search |
-
percentile (百分位), percentile rank
1 | GET /shopping/_search |
-
top hits(排在前面的示例)
1 | GET /shopping/_search |
Bucket Aggregation(桶聚合)
-
按照一定的规则,将文档分配到不同的桶中,从而达到分类的目的。
-
ES提供的一些常见的 Bucket Aggregation。
- terms(词条), range(范围), date_range(日期范围), ip_range(IP范围), missing(缺失), histogram(直方图), date_histogram(日期直方图), geo_distance(地理距离), significant_terms(重要词条), composite(组合)
-
桶聚合可以用于各种场景,例如:
- 对数据进行分组统计,比如按照地区、年龄段、性别等字段进行分组统计。
- 对时间序列数据进行时间段分析,比如按照每小时、每天、每月、每季度、每年等时间段进行分析。
- 对各种标签信息分类,并统计其数量。
terms(词条)
-
按照字段的值进行分组,并统计每个组的数量。
-
示例:按照category字段进行分组,并统计每个组的数量。
1 | GET /shopping/_search |
-
限定聚合范围
1 | GET /shopping/_search |
range(范围)
-
按照字段的值进行分组,并统计每个组的数量。
-
示例:按照价格范围进行分组,并统计每个组的数量。
1 | GET /shopping/_search |
date_range(日期范围)
-
按照字段的值进行分组,并统计每个组的数量。
-
示例:按照日期范围进行分组,并统计每个组的数量。
1 | GET /shopping/_search |
histogram(直方图)
-
按照间隔进行分组,并统计每个组的数量。
-
示例:按照价格的间隔进行分组,并统计每个组的数量。
1 | GET /shopping/_search |
top_hits(分桶取前N条)
-
按照字段的值进行分组,并返回每个组的前N条数据。
-
示例:按照category进行分组,并返回每个组的前3条数据。
1 | GET /shopping/_search |
子聚合
-
子聚合:在聚合函数中,还可以再定义一个聚合函数。
-
示例:按照category进行分组,并统计价格信息
1 | GET /shopping/_search |
Pipeline Aggregation(管道聚合)
-
支持对聚合分析的结果,再次进行聚合分析。
-
Pipeline 的分析结果会输出到原结果中,根据位置的不同,分为两类:
- Sibling - 结果和现有分析结果同级
- Max,min,Avg & Sum Bucket
- Stats,Extended Status Bucket
- Percentiles Bucket
- Parent -结果内嵌到现有的聚合分析结果之中
- Derivative(求导)
- Cumultive Sum(累计求和)
- Moving Function(移动平均值)
- Sibling - 结果和现有分析结果同级
Max,min,Avg & Sum Bucket
-
Max,min,Avg & Sum Bucket:对聚合分析的结果进行最大值、最小值、平均值、求和等操作。
-
示例:按照category进行分组求出商品的平均价格,并找出平均价格最低的分组
1 | GET /shopping/_search |
Stats,Extended Status Bucket
-
Stats,Extended Status Bucket:对聚合分析的结果进行统计操作,包括最大值、最小值、平均值、求和、数量等。
-
示例:按照category进行分组求出商品的平均价格,并对分组结果进行统计操作
1 | GET /shopping/_search |
Percentiles Bucket
-
Percentiles Bucket:对聚合分析的结果进行百分比操作,包括百分比、中位数等。
-
示例:按照category进行分组求出商品的平均价格,并对分组结果进行百分比操作
1 | GET /shopping/_search |
Cumulative Sum
-
Cumulative Sum:对聚合分析的结果进行累计求和操作。
-
示例: 按照价格进行分组,并统计平均价格信息,对分组结果进行累计求和操作。
1 | GET /shopping/_search |
Derivative
-
Derivative:对聚合分析的结果进行求导操作。
-
Derivative 聚合查询是 Elasticsearch 中的一种高级聚合类型,用于计算某个度量值随时间(或其他顺序字段)变化的速率。它通常用于时间序列分析,以揭示度量值的增减趋势。
-
示例:显示每天的平均价格以及平均价格的变化趋势
1 | GET /shopping/_search |
Moving Function
-
Moving Function:对聚合分析的结果进行移动平均值操作。
-
Moving Function 聚合查询是 Elasticsearch 中的一种高级聚合类型,用于计算某个度量值在时间窗口内的移动平均值。它通常用于时间序列分析,以了解度量值的变化趋势。
-
示例:计算 price 字段的 7 天移动平均值
1 | GET /shopping/_search |
ES 聚合性能优化
索引预排序
-
如果是 Elasticsearch 6.X 之后版本,可以在插入数据时对索引进行预排序,而不是在查询时再对索引进行排序,这将提高范围查询(range query)和排序操作的性能。
-
但预排序将增加 Elasticsearch 写入的成本,导致大约 40%-50% 的写性能下降,如果应用场景是更关注写性能的业务,开启索引预排序不是一个很好的选择。
1 | PUT /my_index |
使用分片请求缓存
-
聚合语句中,设置:size:0,就会使用分片请求缓存缓存结果。size = 0 的含义是:只返回聚合结果,不返回查询结果。
1 | GET /my_index/_search |
拆分聚合,使聚合并行化
-
Elasticsearch 查询条件中同时有多个条件聚合,默认情况下聚合不是并行运行的。
-
当为每个聚合提供自己的查询并执行 msearch 时,性能会有显著提升。
-
因此,在 CPU 资源不是瓶颈的前提下,如果想缩短响应时间,可以将多个聚合拆分为多个查询,借助:msearch 实现并行聚合。
1 | #常规的多条件聚合实现 |