谈谈 ES 6.8 到 7.10 的功能变迁(4)- 聚合功能篇

ops/2025/2/27 3:34:05/

这一篇我们继续了解 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 聚合可以用来确定每天有多少独立访问者是"新"的。

可以通过 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 类型字段。

代码样例

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 - 分布在均值两侧的极端值出现的概率比正态分布更高。

测试代码

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 版本中新增的聚合方法。相较于查询方法的高使用频率和低资源占用,聚合方法的使用频率相对较少,内存也会有一定的占用,大家可以根据实际场景选择使用。

推荐阅读

  • 谈谈 ES 6.8 到 7.10 的功能变迁(1)- 性能优化篇
  • 谈谈 ES 6.8 到 7.10 的功能变迁(2)- 字段类型篇
  • 谈谈 ES 6.8 到 7.10 的功能变迁(3)- 查询方法篇
  • 谈谈 ES 6.8 到 7.10 的功能变迁(5)- 任务和集群管理
  • 谈谈 ES 6.8 到 7.10 的功能变迁(6)- 其他

http://www.ppmy.cn/ops/161580.html

相关文章

【删边问题——Tarjan求割边】

题目 并查集暴力代码 30p #include <bits/stdc.h> using namespace std; using ll long long;const int N 1e510;int n, m; int a[N], p[N]; ll ans 1e18; ll s[3]; bool st;struct edge {int a, b; } e[N];void init() {for(int i 1; i < n; i)p[i] i; }int fi…

DeepSeek基础之机器学习

文章目录 一、核心概念总结&#xff08;一&#xff09;机器学习基本定义&#xff08;二&#xff09;基本术语&#xff08;三&#xff09;假设空间&#xff08;四&#xff09;归纳偏好&#xff08;五&#xff09;“没有免费的午餐”定理&#xff08;NFL 定理&#xff09; 二、重…

【数据挖掘在量化交易中的应用:特征发现与特征提取】

好的&#xff0c;我将撰写一篇关于金融领域数据挖掘的技术博客&#xff0c;重点阐述特征发现和特征提取&#xff0c;特别是在量化交易中的应用。我会提供具体的实操步骤&#xff0c;并结合Python和TensorFlow进行代码示例。 完成后&#xff0c;我会通知您进行查看。 数据挖掘…

面试题——简述Vue 3的服务器端渲染(SSR)是如何工作的?

面试题——简述Vue3的服务器端渲染&#xff08;SSR&#xff09;是如何工作的&#xff1f; 服务器端渲染&#xff08;SSR&#xff09;已经成为了一个热门话题。Vue 3&#xff0c;作为一款流行的前端框架&#xff0c;也提供了强大的SSR支持。那么&#xff0c;Vue 3的SSR究竟是如何…

前端排序算法完全指南:从理论到实践

<!DOCTYPE html> <html> <head><title>前端排序算法终极指南</title><style>.container { max-width: 1000px; margin: 0 auto; padding: 20px; }.demo-container { margin: 30px 0; border: 1px solid #eee; padding: 20px; }.bars-wrapp…

Ascend NPU 架构 CANN 平台入门学习

Ascend NPU 架构 & CANN 平台入门学习 文章目录 Ascend NPU 架构 & CANN 平台入门学习 一、概述二、NPU 硬件架构 2.1 NPU SOC 架构 2.1.1 Ascend 3XX 架构2.1.2 Ascend 9XX 架构 2.2 NPU 达芬奇架构 2.2.1 计算单元2.2.2 存储单元2.2.3 控制单元 2.3 AI Core 电路结…

Mac 版 本地部署deepseek ➕ RAGflow 知识库搭建流程分享(附问题解决方法)

安装&#xff1a; 1、首先按照此视频的流程一步一步进行安装&#xff1a;(macos版&#xff09;ragflowdeepseek 私域知识库搭建流程分享_哔哩哔哩_bilibili 2、RAGflow 官网文档指南&#xff1a;https://ragflow.io 3、RAGflow 下载地址&#xff1a;https://github.com/infi…

《论单元测试方法及应用》审题技巧 - 系统架构设计师

论文写作框架 一、考点概述 本论题主要考察软件测试工程师在软件项目管理与开发过程中的实践经验和理论知识。论题涵盖三大核心内容&#xff1a;一是参与管理和开发的软件项目的概述及个人主要工作职责&#xff1b;二是静态测试和动态测试这两种单元测试方法的基本内容&#…