ElasticSearch深入解析(十二):聚合——分桶聚合、指标聚合、管道子聚合

news2025/5/20 22:58:24

文章目录

  • 一、分桶聚合
    • 1. 分桶聚合的核心逻辑与核心类型
    • 2. 分桶聚合的高级特性
  • 二、指标聚合
    • 1. 指标聚合的核心逻辑与基础类型
      • (1)基础统计指标(单值输出)
      • (2)复合统计指标(多值输出)
    • 2. 指标聚合与分桶聚合的嵌套使用
    • 3. 高级特性与灵活扩展
      • (1)地理空间指标
      • (2)脚本支持
      • (3)缺失值处理
  • 三、管道子聚合
    • 1. 桶排序(`bucket_sort`)
    • 2. 桶过滤(`bucket_selector`)
    • 3. 桶脚本(`bucket_script`)
    • 4. 累积聚合(如`cumulative_sum`)
    • 5. 滑动窗口聚合(如`moving_avg`)
    • 6. 桶统计聚合(如`avg_bucket`、`sum_bucket`)

在数据驱动决策的时代,聚合函数作为数据分析与数据挖掘的核心工具,正发挥着越来越重要的作用。它能够对大量数据进行高效处理,通过诸如求和、求平均、计数、最值计算等操作,帮助用户从复杂的数据集中提炼关键信息,快速把握数据的整体特征。

无论是企业分析业务指标、科研人员处理实验数据,还是普通用户进行日常数据整理,聚合函数都能凭借其强大的数据归纳能力,助力用户深入理解数据内涵、精准识别核心要素,并清晰洞察数据背后隐藏的趋势与规律,为后续的分析决策提供坚实的数据支撑。

掌握聚合函数的原理与应用,意味着在数据海洋中拥有了一把高效的 “指南针”,能够更从容地挖掘数据价值,释放数据潜力。

  • 应用场景:
聚合类型核心目标输入数据典型应用场景举例
分桶聚合划分分析单元(分组)原始文档数据按地区/时间/类别分组
指标聚合计算桶内统计值(量化)分桶后的文档数据计算各分组的销售额、用户数、均值
管道子聚合加工聚合结果(二次分析)分桶或指标的输出结果排序Top N、累积和、滑动平均、占比

一、分桶聚合

在Elasticsearch中,分桶聚合(Bucket Aggregations) 是数据分析的核心功能之一,其作用是将符合条件的文档按照特定规则“分组”(形成桶),以便对每个分组内的数据进行统计分析。这种机制类似于SQL中的GROUP BY,但支持更丰富的分组策略和复杂场景,尤其适合非结构化数据的大规模实时分析。

1. 分桶聚合的核心逻辑与核心类型

分桶聚合的本质是根据文档字段或表达式创建“桶”,每个桶包含一组满足条件的文档。核心操作包括:
单字段分桶:基于字段值分组,典型代表是terms聚合(适用于离散值,如标签、用户ID)。

{
  "aggs": {
    "user_groups": {
      "terms": { "field": "user_id", "size": 10 } // 按user_id分组,返回Top 10
    }
  }
}

范围分桶:将数值/日期按区间分组,包括range(自定义区间)和histogram(等距连续区间,适用于数值)。

{
  "aggs": {
    "age_ranges": {
      "range": {
        "field": "age",
        "ranges": [{"from": 0, "to": 18}, {"from": 18, "to": 60}]
      }
    }
  }
}

时间序列分桶:针对日期数据的专属分桶,date_histogram支持按时间间隔(如天、小时)自动生成桶,常用于日志分析、趋势监控。

{
  "aggs": {
    "daily_logs": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "day", // 按天分组
        "format": "yyyy-MM-dd"
      }
    }
  }
}

地理分桶:针对地理坐标数据,如geo_distance(按距离分组)和geo_hash_grid(地理网格分组),适用于位置相关分析(如门店辐射范围统计)。

2. 分桶聚合的高级特性

复合分桶:支持嵌套聚合,即在一个桶内再创建子桶,实现多层分组。

{
  "aggs": {
    "country_groups": {
      "terms": { "field": "country" },
      "aggs": { // 子聚合:每个国家内按城市分组
        "city_groups": { "terms": { "field": "city" } }
      }
    }
  }
}

脚本分桶:通过script参数支持自定义分组逻辑,例如基于表达式或动态字段分组。

{
  "aggs": {
    "custom_buckets": {
      "terms": {
        "script": {
          "source": "doc['price'].value > 100 ? 'high' : 'low'",
          "lang": "painless"
        }
      }
    }
  }
}

缺失值处理:通过missing参数指定未匹配桶的处理方式(如单独归为一个桶)。

{
  "aggs": {
    "product_categories": {
      "terms": { "field": "category", "missing": "Uncategorized" }
    }
  }
}

二、指标聚合

在Elasticsearch的聚合体系中,指标聚合(Metric Aggregations) 是与分桶聚合(Bucket Aggregations)相辅相成的核心模块。分桶聚合负责将数据分组,而指标聚合则专注于对每个分组(或全局数据)进行数值计算,输出统计指标(如平均值、总和、最大值等),最终为数据分析提供量化依据。本文将从核心类型、使用场景、高级特性等方面深入解析指标聚合的能力。

1. 指标聚合的核心逻辑与基础类型

指标聚合的本质是对文档字段或表达式进行计算,返回一个或多个数值型结果。它支持两种输入形式:

  1. 单桶场景:对全局数据或某个分桶内的文档计算指标(需与分桶聚合嵌套使用)。
  2. 无桶场景:直接对查询结果集计算指标(独立使用,无需分组)。

(1)基础统计指标(单值输出)

  • count:统计文档数量(等价于SQL的COUNT(*))。

    {
      "aggs": {
        "total_products": { "count": {} } // 统计总文档数
      }
    }
    
  • sum / avg / min / max:对数值型字段求和、求平均、求极值(等价于SQL的SUM/AVG/MIN/MAX)。

    {
      "aggs": {
        "avg_price": { "avg": { "field": "price" } },
        "total_sales": { "sum": { "field": "quantity" } }
      }
    }
    
  • sum_of_squares:计算字段值的平方和(用于方差/标准差的前置计算)。

(2)复合统计指标(多值输出)

  • stats:一次性返回countminmaxavgsum五个指标(高效批量计算)。

    {
      "aggs": {
        "price_stats": { "stats": { "field": "price" } }
      }
    }
    

    输出示例:

    {
      "price_stats": {
        "count": 100,
        "min": 10.0,
        "max": 500.0,
        "avg": 150.5,
        "sum": 15050.0
      }
    }
    
  • extended_stats:在stats基础上额外返回方差、标准差、标准误等高级统计值,适合需要深度统计分析的场景(如质量控制、数据分布评估)。

2. 指标聚合与分桶聚合的嵌套使用

指标聚合通常作为分桶聚合的子聚合,对每个桶内的数据独立计算指标,形成“分组+度量”的完整分析链路。例如:

{
  "aggs": {
    "monthly_sales": { // 按月份分桶(分桶聚合)
      "date_histogram": { "field": "sale_date", "interval": "month" },
      "aggs": { // 子聚合:对每个月份桶计算指标
        "avg_order_amount": { "avg": { "field": "amount" } }, // 月均订单金额
        "total_orders": { "count": {} } // 月订单量
      }
    }
  }
}

上述示例中,date_histogram先将数据按月份分组,子聚合avgcount分别计算每个月份桶的平均金额和订单数,最终输出时间序列下的多指标分析结果。

3. 高级特性与灵活扩展

(1)地理空间指标

  • geo_bounds:计算地理坐标字段(如geo_point)的边界范围(返回包含所有点的最小矩形的左上角和右下角坐标),常用于地图展示时的视口自动缩放。
  • geo_centroid:计算地理坐标的中心点(质心),适用于分析位置数据的聚集趋势(如用户分布中心)。

(2)脚本支持

通过script参数,指标聚合可基于Painless脚本实现自定义计算逻辑,例如:

  • 对字段进行转换后计算(如对日志中的响应时间戳转换为耗时)。
  • 结合多个字段计算复合指标(如计算单价×数量的总和)。
{
  "aggs": {
    "total_revenue": {
      "sum": {
        "script": {
          "source": "doc['price'].value * doc['quantity'].value",
          "lang": "painless"
        }
      }
    }
  }
}

(3)缺失值处理

通过missing参数指定字段缺失时的替代值(仅对数值型指标有效),例如:

{
  "aggs": {
    "avg_rating": {
      "avg": { "field": "rating", "missing": 0.0 } // 缺失评分视为0分
    }
  }
}

三、管道子聚合

在Elasticsearch中,管道子聚合(Pipeline Sub-Aggregation) 是一类特殊的聚合,其输入不是原始文档数据,而是依赖于其他聚合(父聚合)的输出结果,用于对父聚合生成的桶或指标进行二次处理。这类聚合通常作为子聚合嵌套在桶聚合(如termsdate_histogram等)或其他支持的聚合中,实现对聚合结果的进一步分析,比如排序、过滤、统计或转换。

  • 核心特点:

    • 依赖父聚合结果:管道子聚合的输入是父聚合生成的桶(Bucket)或指标(Metric),而非文档数据。
    • 嵌套使用:必须作为子聚合存在于父聚合(通常是桶聚合)中,不能直接在查询层级独立使用。
    • 处理聚合结果:用于对父聚合的输出进行排序、过滤、计算累积值、滑动值等操作。
  • 使用场景:

    • 排序与过滤:对分组结果按特定指标排序(bucket_sort)或过滤(bucket_selector),例如热门商品Top 10。
    • 时间序列分析:在时间桶(如date_histogram)上计算累积值(cumulative_sum)或滑动窗口值(moving_avg),用于趋势分析。
    • 比例与统计:通过bucket_script计算占比,或通过avg_bucket计算分组指标的统计值。
    • 复杂业务逻辑:结合脚本(如Painless)实现自定义的桶处理逻辑。
  • 注意事项:

    • 父聚合要求:管道子聚合必须嵌套在支持的父聚合(通常是桶聚合)中,且父聚合需生成有序的桶(如时间序列)或可统计的桶集合。
    • buckets_path参数:多数管道聚合通过buckets_path指定父聚合的指标路径(格式为父聚合名称.子聚合名称)。
    • 性能影响:复杂的管道聚合可能增加计算开销,尤其是嵌套多层聚合时需注意优化。

1. 桶排序(bucket_sort

  • 功能:对父聚合生成的桶按指定指标排序,保留前N个桶。
  • 示例:按省份分组(terms聚合)后,按每个省份的销售额降序排序,取前3个省份。
{
  "aggs": {
    "province_groups": {
      "terms": { "field": "province" },
      "aggs": {
        "sorted_by_sales": {
          "bucket_sort": {
            "sort": [
              { "sales_total": { "order": "desc" } }  // 按子聚合指标排序
            ],
            "size": 3  // 保留前3个桶
          }
        }
      }
    }
  }
}

2. 桶过滤(bucket_selector

  • 功能:通过脚本或条件过滤父聚合的桶,仅保留符合条件的桶。
  • 示例:过滤出销售额超过1000的省份组。
{
  "aggs": {
    "province_groups": {
      "terms": { "field": "province" },
      "aggs": {
        "filter_high_sales": {
          "bucket_selector": {
            "script": "params.sales_total > 1000"  // 保留满足条件的桶
          }
        }
      }
    }
  }
}

3. 桶脚本(bucket_script

  • 功能:对每个桶应用脚本,生成新的指标或修改现有指标。
  • 示例:为每个省份组计算销售额占总和的比例。
{
  "aggs": {
    "province_groups": {
      "terms": { "field": "province" },
      "aggs": {
        "sales_ratio": {
          "bucket_script": {
            "script": {
              "source": "def total = params._agg.province_groups.sum; doc['sales_total'] / total",
              "params": { "sum": { "sum": { "field": "sales" } } }  // 引入父聚合的总和
            }
          }
        }
      }
    }
  }
}

4. 累积聚合(如cumulative_sum

  • 功能:按顺序计算父聚合结果的累积值(如时间序列的累积和)。
  • 示例:按天分组后计算每天的累积销售额。
{
  "aggs": {
    "daily_sales": {
      "date_histogram": { "field": "order_date", "interval": "day" },
      "aggs": {
        "cumulative_sales": {
          "cumulative_sum": { "buckets_path": "sales_total" }  // 对父聚合的`sales_total`指标求累积和
        }
      }
    }
  }
}

5. 滑动窗口聚合(如moving_avg

  • 功能:在有序的桶(如时间序列)上计算滑动窗口的平均值。
  • 示例:计算最近7天的滑动平均销售额。
{
  "aggs": {
    "daily_sales": {
      "date_histogram": { "field": "order_date", "interval": "day" },
      "aggs": {
        "moving_avg_7d": {
          "moving_avg": {
            "buckets_path": "sales_total",
            "window_size": 7  // 窗口大小为7天
          }
        }
      }
    }
  }
}

6. 桶统计聚合(如avg_bucketsum_bucket

  • 功能:对父聚合的所有桶的指标进行统计(如求平均值、总和)。
  • 示例:计算所有省份的平均销售额。
{
  "aggs": {
    "province_groups": {
      "terms": { "field": "province" },
      "aggs": {
        "sales_avg": {
          "avg_bucket": { "buckets_path": "sales_total" }  // 对所有桶的`sales_total`求平均
        }
      }
    }
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2379456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新电脑软件配置二:安装python,git, pycharm

安装python 地址 https://www.python.org/downloads/ 不是很懂为什么这么多版本 安装windows64位的 这里我是凭自己感觉装的了 然后cmd输入命令没有生效,先重启下? 重启之后再次验证 环境是成功的 之前是输入的python -version 命令输入错误 安装pyc…

数据仓库:企业数据管理的核心引擎

一、数据仓库的由来 数据仓库(Data Warehouse, DW)概念的诞生源于企业对数据价值的深度挖掘需求。在1980年代,随着OLTP(联机事务处理)系统在企业中的普及,传统关系型数据库在处理海量数据分析时显露出明显瓶…

MCU开发学习记录17* - RTC学习与实践(HAL库) - 日历、闹钟、RTC备份寄存器 -STM32CubeMX

名词解释: RTC:Real-Time Clock​ 统一文章结构(数字后加*): 第一部分: 阐述外设工作原理;第二部分:芯片参考手册对应外设的学习;第三部分:使用STM32CubeMX进…

C++中的四种强制转换

static_cast 原型&#xff1a;static_cast<type-id>(expression) type-id表示目标类型&#xff0c;expression表示要转换的表达式 static_cast用于非多态类型的转换&#xff08;静态转换&#xff09;&#xff0c;编译器隐式执行的任何类型转换都可用static_c…

YOLOv2目标检测算法:速度与精度的平衡之道

一、YOLOv2的核心改进&#xff1a;从V1到V2的蜕变 YOLOv2作为YOLO系列的第二代算法&#xff0c;在继承V1端到端、单阶段检测的基础上&#xff0c;针对V1存在的小目标检测弱、定位精度低等问题进行了全方位升级&#xff0c;成为目标检测领域的重要里程碑。 &#xff08;一&am…

利用腾讯云MCP提升跨平台协作效率的实践与探索

一、场景痛点 在当今这个数字化快速发展的时代&#xff0c;跨平台协作成为了许多企业和团队面临的一个重大挑战。随着企业业务的不断拓展&#xff0c;团队成员往往需要利用多种工具和平台进行沟通、协作和管理。这些平台包括但不限于电子邮件、即时通讯工具、项目管理软件、文…

【Vue篇】数据秘语:从watch源码看响应式宇宙的蝴蝶效应

目录 引言 一、watch侦听器&#xff08;监视器&#xff09; 1.作用&#xff1a; 2.语法&#xff1a; 3.侦听器代码准备 4. 配置项 5.总结 二、翻译案例-代码实现 1.需求 2.代码实现 三、综合案例——购物车案例 1. 需求 2. 代码 引言 &#x1f4ac; 欢迎讨论&#…

OGGMA 21c 微服务 (MySQL) 安装避坑指南

前言 这两天在写 100 天实战课程 的 OGG 微服务课程&#xff1a; 在 Oracle Linux 8.10 上安装 OGGMA 21c MySQL 遇到了一点问题&#xff0c;分享给大家一起避坑&#xff01; 环境信息 环境信息&#xff1a; 主机版本主机名实例名MySQL 版本IP 地址数据库字符集Goldengate …

Linux面试题集合(4)

现有压缩文件:a.tar.gz存在于etc目录&#xff0c;如何解压到data目录 tar -zxvf /etc/a.tar.gz -C /data 给admin.txt创建一个软链接 ln -s admin.txt adminl 查找etc目录下以vilinux开头的文件 find /etc -name vilinux* 查找admin目录下以test开头的文件 find admin -name te…

Android Studio 安装与配置完全指南

文章目录 第一部分&#xff1a;Android Studio 简介与安装准备1.1 Android Studio 概述1.2 系统要求Windows 系统&#xff1a;macOS 系统&#xff1a;Linux 系统&#xff1a; 1.3 下载 Android Studio 第二部分&#xff1a;安装 Android Studio2.1 Windows 系统安装步骤2.2 mac…

基于 Zookeeper 部署 Kafka 集群

文章目录 1、前期准备2、安装 JDK 83、搭建 Zookeeper 集群3.1、下载3.2、调整配置3.3、标记节点3.4、启动集群 4、搭建 Kafka 集群4.1、下载4.2、调整配置4.3、启动集群 1、前期准备 本次集群搭建使用&#xff1a;3 Zookeeper 3 Kafka&#xff0c;所以我在阿里云租了3台ECS用…

IDE/IoT/搭建物联网(LiteOS)集成开发环境,基于 LiteOS Studio + GCC + JLink

文章目录 概述LiteOS Studio不推荐&#xff1f;安装和使用手册呢?HCIP实验的源码呢&#xff1f; 软件和依赖安装软件下载软件安装插件安装依赖工具-方案2依赖工具-方案1 工程配置打开或新建工程板卡配置组件配置编译器配置-gcc工具链编译器配置-Makefile脚本其他配置编译完成 …

算法加训之最短路 上(dijkstra算法)

目录 P4779 【模板】单源最短路径&#xff08;标准版&#xff09;&#xff08;洛谷&#xff09; 思路 743. 网络延迟时间&#xff08;力扣&#xff09; 思路 1514.概率最大路径&#xff08;力扣&#xff09; 思路 1631.最小体力消耗路径 思路 1976. 到达目的地的方案数 …

QT+Opencv 卡尺工具找直线

QTOpencv 卡尺工具找直线 自己将别的项目中&#xff0c;单独整理出来的。实现了一个找直线的工具类。 功能如下&#xff1a;1.添加图片 2.添加卡尺工具 3.鼠标可任意拖动图片和卡尺工具 4.可调整卡尺参数和直线拟合参数 5.程序中包含了接口函数&#xff0c;其他cpp文件传入相…

GraphPad Prism简介、安装与工作界面

《2025GraphPad Prism操作教程书籍 GraphPad Prism图表可视化与统计数据分析视频教学版GraphPad Prism科技绘图与数据分析学术图表 GraphPadPrism图表》【摘要 书评 试读】- 京东图书 GraphPad Prism统计数据分析_夏天又到了的博客-CSDN博客 1.1 GraphPad Prism简介 GraphP…

esp32课设记录(一)按键的短按、长按与双击

课程用的esp32的板子上只有一个按键&#xff0c;引脚几乎都被我用光了&#xff0c;很难再外置按键。怎么控制屏幕的gui呢&#xff1f;这就得充分利用按键了&#xff0c;比如说短按、长按与双击&#xff0c;实现不同的功能。 咱们先从短按入手讲起。 通过查看原理图&#xff0c;…

React19源码系列之 API(react-dom)

API之 preconnect preconnect – React 中文文档 preconnect 函数向浏览器提供一个提示&#xff0c;告诉它应该打开到给定服务器的连接。如果浏览器选择这样做&#xff0c;则可以加快从该服务器加载资源的速度。 preconnect(href) 一、使用例子 import { preconnect } fro…

supervisorctl守护进程

supervisorctl守护进程 1 安装 # ubuntu安装&#xff1a; sudo apt-get install supervisor 完成后可以在/etc/supervisor文件夹&#xff0c;找到supervisor.conf。 如果没有的话可以用如下命令创建配置文件&#xff08;注意必须存在/etc/supervisor这个文件夹&#xff09; s…

下载的旧版的jenkins,为什么没有旧版的插件

下载的旧版的jenkins&#xff0c;为什么没有旧版的插件&#xff0c;别急 我的jenkins版本&#xff1a; 然后我去找对应的插件 https://updates.jenkins.io/download/plugins/ 1、Maven Integration plugin&#xff1a; Maven 集成管理插件。 然后点击及下载成功 然后 注意&…

【ALINX 实战笔记】FPGA 大神 Adam Taylor 使用 ChipScope 调试 AMD Versal 设计

本篇文章来自 FPGA 大神、Ardiuvo & Hackster.IO 知名博主 Adam Taylor。在这里感谢 Adam Taylor 对 ALINX 产品的关注与使用。为了让文章更易阅读&#xff0c;我们在原文的基础上作了一些灵活的调整。原文链接已贴在文章底部&#xff0c;欢迎大家在评论区友好互动。 在上篇…