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

news/2025/2/26 13:07:01

这一篇我们继续了解 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.niftyadmin.cn/n/5868737.html

相关文章

东信营销科技巨额补贴仍由盈转亏:毛利率大幅下滑,现金流告急

《港湾商业观察》施子夫 近期,东信营销科技有限公司(以下简称,东信营销科技)递表港交所,联席保荐机构为海通国际和中银国际。 东信营销科技的国内运营主体为深圳市东信时代信息技术有限公司。尽管期内收入规模有所提…

Centos主机基础设置和网络网卡设置,安装ansible、docker(修改ip、uuid、主机名、关闭防火墙selinux和networkmanager)

克隆主机 启动主机 查看ip地址 修改ip地址和UUID更换UUID uuidgen生成UUID 修改ip地址 sed -i ‘/IPADDR/cIPADDR10.1.1.10’ /etc/sysconfig/network-scripts/ifcfg-ens33 也可以直接将58替换成10 sed -i ‘/IPADDR/s/58/10/’ /etc/sysconfig/network-scripts/ifcfg-en…

基于YOLO11深度学习的苹果叶片病害检测识别系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

在llm和agent的背景下,有什么比较好的研究方向或者能解决现在的实际的社会问题

在llm和agent的背景下,有什么比较好的研究方向或者能解决现在的实际的社会问题 在LLM(大语言模型)与Agent(智能体)的融合背景下,研究方向和社会应用正呈现出多元化趋势。 一、技术研究方向 多模态智能体(Multi-modal Agents) 方向:将LLM与视觉、语音、触觉等多模态数…

计算机视觉(opencv-python)入门之图像的读取,显示,与保存

在计算机视觉领域,Python的cv2库是一个不可或缺的工具,它提供了丰富的图像处理功能。作为OpenCV的Python接口,cv2使得图像处理的实现变得简单而高效。 示例图片 目录 opencv获取方式 图像基本知识 颜色空间 RGB HSV CV2常用图像处理方…

Web自动化之Selenium控制已经打开的浏览器(Chrome,Edge)

在使用selenium进行web自动化或爬虫的时候,经常会面临登录的情况,对于这种情况,我们可以利用Selenium控制已经打开的浏览器,从而避免每次都需要重新打开浏览器并进行登录的繁琐步骤。 目录 说明 启动浏览器 注意 --user-data-dir说明 代码设定 代码 改进代…

每天一个Flutter开发小项目 (4) : 构建收藏地点应用 - 深入Flutter状态管理

引言 欢迎回到 每天一个Flutter开发小项目 系列博客!在前三篇博客中,我们从零开始构建了计数器应用、待办事项列表应用,以及简易天气应用。您不仅掌握了 Flutter 的基础组件和布局,还学习了网络请求、JSON 解析等实用技能,更重要的是,我们一起探讨了高效的 Flutter 学习…

Redis面试知识点总结

目录 1. Redis 基础知识2. 基本数据结构(底层实现)2.1 SDS2.2 链表2.3 字典2.4 跳跃表2.5 整数集合2.6 压缩列表 3. 对象3.1 字符串对象3.2 列表对象3.3 哈希对象3.4 集合对象 set3.5 有序集合对象 zset 4. 数据库4.1 RDB 持久化4.2 AOF 持久化4.3 数据淘…