--- title: "谈谈 ES 6.8 到 7.10 的功能变迁(4)- 聚合功能篇" date: 2025-02-09 lastmod: 2025-02-09 description: "ES 7.10新增聚合方法,包括Rare Terms(稀有项查询)、Cumulative Cardinality(累积基数计算)、Geotile Grid(地理网格聚合)、T-test(假设检验)、Variable Width Histogram(可变直方图)、Normalize(归一化)、Moving Percentiles(移动百分位数)和Rate(速率计算),适用于不同场景数据分析。" tags: ["Elasticsearch"] summary: "这一篇我们继续了解 ES 7.10 相较于 ES 6.8 新增的聚合方法。 Rare Terms 聚合 # 功能说明 # 用于聚合查询出字段中的稀有项。ES 常见的统计方法是使用 term 查询的正向排序,但是在大数据量和高基数的数据分布场景下会出现 unbounded 错误。Rare 聚合弥补了这个场景的查询方法。注意的是,这个聚合计算出来的是一个近似值。 注意事项 # 使用限制 # 只能用于 keyword、numeric、ip 或 boolean 类型字段 max_doc_count 参数限制文档数量(默认为 1) precision_threshold 参数控制精度(默认为 3000) 性能考虑 # 在高基数(数据集中不同值的数量非常多)字段上性能较好 内存消耗相对较大 聚合是在 shard 层做的统计,建议使用合适的 shard 大小 精度控制 # 结果是近似值,具体说明 见此 可以通过 precision_threshold 调整精度,精度越高,内存消耗越大 Cumulative Cardinality 聚合 # 功能说明 # 一个管道聚合,计算 histogram(或 date_histogram)聚合中的累积基数。 Cumulative_cardinality 聚合对于查找几个时间段内的"新项目"很有用,比如每天网站的新访客数量。常规 Cardinaity 聚合会告诉你每天有多少独立访客,但不会区分"新"或"重复"访客。Cumulative_cardinality 聚合可以用来确定每天有多少独立访问者是"新"的。" --- 这一篇我们继续了解 ES 7.10 相较于 ES 6.8 新增的聚合方法。 ## Rare Terms 聚合 ### 功能说明 用于聚合查询出字段中的稀有项。**ES 常见的统计方法是使用 term 查询的正向排序,但是在大数据量和高基数的数据分布场景下会出现 unbounded 错误。Rare 聚合弥补了这个场景的查询方法**。注意的是,这个聚合计算出来的是一个近似值。 ### 注意事项 #### 使用限制 - 只能用于 keyword、numeric、ip 或 boolean 类型字段 - max_doc_count 参数限制文档数量(默认为 1) - precision_threshold 参数控制精度(默认为 3000) #### 性能考虑 - 在**高基数**(数据集中不同值的数量非常多)字段上性能较好 - **内存消耗相对较大** - 聚合是在 shard 层做的统计,建议使用合适的 shard 大小 #### 精度控制 - 结果是近似值,具体说明[见此](https://www.elastic.co/guide/en/elasticsearch/reference/7.10/search-aggregations-bucket-rare-terms-aggregation.html#_precision) - 可以通过 precision_threshold 调整精度,精度越高,内存消耗越大 ## Cumulative Cardinality 聚合 ### 功能说明 一个管道聚合,计算 histogram(或 date_histogram)聚合中的累积基数。 Cumulative_cardinality 聚合对于查找**几个时间段内的"新项目"很有用**,比如每天网站的新访客数量。常规 Cardinaity 聚合会告诉你每天有多少独立访客,但不会区分"新"或"重复"访客。Cumulative_cardinality 聚合可以用来确定每天有多少独立访问者是"新"的。 可以通过 precision_threshold 参数调整精度,内存消耗随精度增加而增加。建议根据实际需求调整精度,避免不必要的高精度设置。 ### 使用要求 - 需要一个 date_histogram 或 histogram 聚合 - 需要一个 cardinality 度量聚合 - buckets_path 必须指向一个有效的 cardinality 聚合 ### 代码样例 ``` GET /user_hits/_search { "size": 0, "aggs": { "users_per_day": { "date_histogram": { "field": "timestamp", "calendar_interval": "day" }, "aggs": { "distinct_users": { "cardinality": { "field": "user_id" } }, "total_new_users": { "cumulative_cardinality": { "buckets_path": "distinct_users" } } } } } } ``` ## Geotile Grid 聚合 ### 功能说明 **基于 geo_point 字段的地理位置多桶聚合**。将地理空间数据按照网格划分,便于可视化和分析。 #### 注意要点 1. 网格设置: precision 参数控制网格精度(0-29),精度越高,网格越小,桶数越多。 2. 高精度会产生大量桶,内存消耗随精度增加而增加。 3. 只支持 geo_point 类型字段。 ### 代码样例 ```json POST /museums/_search?size=0 { "aggregations": { "tiles-in-bounds": { "geotile_grid": { "field": "location", "precision": 22, "bounds": { "top_left": "52.4, 4.9", "bottom_right": "52.3, 5.0" } } } } } ``` ## T-test 聚合 ### 功能说明 T_test 是一种统计假设检验,用于判断测试统计量在零假设下是否服从**学生 t 分布(Student’s t-distribution)**。它适用于从聚合文档中提取的数值或通过提供的脚本生成的数值。 该聚合将会返回该检验的 p 值(概率值)。它是在零假设正确的情况下(这意味着总体均值之间没有差异),获得至少与聚合所处理结果一样极端结果的概率。p 值越小,意味着零假设越有可能不正确,总体均值实际上是存在差异的。 #### 关于 Student’s t-distribution Student's t - distribution(学生 t - 分布),简称 t - 分布,是一种概率分布。它在统计学中具有重要地位,特别是在样本量较小且总体标准差未知的情况下用于对总体均值进行估计和假设检验。 它的形状类似于正态分布,呈钟形曲线,但比正态分布的 “尾部” 更厚。也就是说,t - 分布在均值两侧的极端值出现的概率比正态分布更高。 ### 测试代码 ```json GET node_upgrade/_search { "size": 0, "aggs": { "startup_time_ttest": { "t_test": { "a": { "field": "startup_time_before" }, "b": { "field": "startup_time_after" }, "type": "paired" } } } } ``` ## Variable Width Histogram 可变直方图聚合 ### 功能说明 类似于 histogram 的多桶聚合。但与 histogram 不同,每个桶的宽度不是预先指定的,而是**根据目标桶数量动态确定间隔**。 #### 参数设置 - field 必须是数值类型 - buckets 参数指定目标桶数 - 实际桶数可能少于指定值 #### 性能考虑 - 比固定宽度直方图更耗资源,大数据集上可能较慢 - 建议限制目标桶数量 #### 使用场景 - 数据分布不均匀时特别有用 - 适合探索性数据分析 - 可以避免空桶或过密桶 ## Normalize 归一化聚合 ### 功能说明 一个管道聚合,用于**计算特定桶值的归一化或重新缩放后的值**。 ### 方法选择 可以归一化处理的方法有: - rescale_0_1:0 到 1 重缩放,这种方法对数据进行重新缩放,使得最小值变为 0,最大值变为 1,其余数值则在两者之间进行线性归一化。 - rescale_0_100:0 到 100 重缩放,该方法对数据进行重新缩放,让最小值变为 0,最大值变为 100,其余数值在它们之间按线性方式进行归一化。 - percent_of_sum:占总和的百分比,此方法对每个值进行归一化,使其表示为占总值的百分比。 - mean:均值归一化,这种方法进行归一化时,每个值依据其与平均值的差异程度来进行归一化。 - zscore:Z 分数归一化,该方法进行归一化时,每个值表示的是其相对于标准差偏离均值的程度。 - softmax:软最大化归一化,这种方法进行归一化时,先对每个值取指数,然后相对于原始值指数之和来进行归一化。 ### 参数配置 - method 参数指定归一化方法 - buckets_path 指定数据来源 - 可以设置缺失值处理 ## Moving Percentiles 聚合 ### 功能介绍 一个管道聚合,对于一组有序的百分位数,移动百分位数聚合(Moving Percentile Aggregation)会在这些百分位数上滑动一个窗口,并计算累积百分位数。 #### 关于 shift 偏移参数 默认情况下(偏移量 shift = 0 时),用于计算的窗口是除当前桶之外的最后 n 个值。将偏移量增加 1 会使起始窗口位置向右移动 1 个单位。 - 若要将当前桶包含在窗口内,请使用 shift = 1。 - 对于居中对齐(当前桶前后各有 n / 2 个值),使用 shift = window / 2。 - 对于右对齐(当前桶之后有 n 个值),使用 shift = window。 如果窗口的任一边缘移动到数据序列边界之外,窗口将会收缩,仅包含可用的值。 ## Rate 聚合 ### 功能说明 在 date_histogram 的聚合上使用,用于**计算每个 date_histogram 桶中的文档速率或字段速率**。 rare 聚合支持多种时间单位(如秒、分、时),使用时需要明确指定单位。可以用来计算文档数或字段值,但必须与 date_histogram 一起使用。 ## 小结 这一篇粗略的列举了 ES 7.10 版本中新增的聚合方法。相较于查询方法的高使用频率和低资源占用,聚合方法的使用频率相对较少,内存也会有一定的占用,大家可以根据实际场景选择使用。