配置Elasticsearch集群聚合增强
场景描述
聚合增强在数据聚簇的情况下,利用向量化技术,批量处理数据,从而提升聚合性能,优化可观测性业务的聚合分析能力。
在大规模数据的集聚合分析场景下,耗时主要集中在对数据的分组聚合。
提升分组聚合能力依赖排序键和聚簇键。
- 排序键:数据按照排序键顺序存储。
- 聚簇键:是排序键的前缀子集,数据按照聚簇键聚簇在一起。
聚合增强常见的使用场景请参见表1。
约束限制
仅Elasticsearch 7.10.2集群支持聚合增强。
低基字段分组聚合
低基字段一般采用分组聚合,在排序的情况下具备较好的数据聚簇性,利于向量化批量处理数据。
例如,查询语句如下所示。
POST testindex/_search { "size": 0, "aggs": { "groupby_region": { "terms": { "field": "region" }, "aggs": { "groupby_host": { "terms": { "field": "host" }, "aggs": { "avg_cpu_usage": { "avg": { "field": "cpu_usage" } } } } } } } }
当需要对“region”和“host”这两个低基字段进行聚合增强,则需要对索引进行如下设置。
// 索引设置 "settings" : { "index" : { "search" : { "turbo" : { "enabled" : "true" // 开启优化 } }, "sort" : { // 指定排序键 "field" : [ "region", "host", "other" ] }, "cluster" : { "field" : [ // 指定聚簇键 "region", "host" ] } } }
聚簇键必须是排序键的前缀子集。
高基字段直方图聚合
高基字段一般采用直方图分组聚合,利于处理某个区间内的数据。
例如,查询语句如下所示。这条查询是对时间字段timestamp做直方图分组,然后求score的平均值。
POST testindex/_search?pretty { "size": 0, "aggs": { "avg_score": { "avg": { "field": "score" }, "aggs": { "groupbytime": { "date_histogram": { "field": "timestamp", "calendar_interval": "day" } } } } } }
当需要对典型的高基字段“timestamp”进行聚合增强时,则需要对索引进行如下设置。
// 索引设置 "settings" : { "index" : { "search" : { "turbo" : { "enabled" : "true" // 开启优化 } }, "sort" : { // 指定排序键 "field" : [ "timestamp" ] } } }
低基字段分组聚合混合高基字段直方图聚合
在低基字段和高基字段混合的场景下,一般先对低基字段做分组聚合,然后再对高基字段做直方图聚合。
假如,查询语句如下所示。
POST testindex/_search { "size": 0, "aggs": { "groupby_region": { "terms": { "field": "region" }, "aggs": { "groupby_host": { "terms": { "field": "host" }, "aggs": { "groupby_timestamp": { "date_histogram": { "field": "timestamp", "interval": "day" }, "aggs": { "avg_score": { "avg": { "field": "score" } } } } } } } } } }
当需要先对“region”低基字段进行分组,再对“host”低基字段进行分组,最后对“timestamp”高基字段进行直方图分组时,聚合增强的索引设置如下。
// 索引设置 "settings" : { "index" : { "search" : { "turbo" : { "enabled" : "true" // 开启优化 } }, "sort" : { // 指定排序键 "field" : [ "region", "host", "timestamp", "other" ] }, "cluster" : { "field" : [ // 指定聚簇键 "region", "host" ] } } }
- 聚簇键必须是排序键的前缀子集。
- 高基字段必须在排序键中,且高基字段必须在最后一个低基字段后面。