Elasticsearch高阶聚合实战:Pipeline Aggregation 用法详解与典型场景全攻略

Elasticsearch高阶聚合实战:Pipeline Aggregation 用法详解与典型场景全攻略

    • 前言
    • [一、什么是 Pipeline Aggregation?](#一、什么是 Pipeline Aggregation?)
      • [1.1 定义](#1.1 定义)
      • [1.2 核心特点](#1.2 核心特点)
      • [1.3 执行流程](#1.3 执行流程)
    • [二、Pipeline Aggregation 分类(两大类)](#二、Pipeline Aggregation 分类(两大类))
      • [2.1 同级管道聚合(Sibling Pipeline)](#2.1 同级管道聚合(Sibling Pipeline))
      • [2.2 父级管道聚合(Parent Pipeline)](#2.2 父级管道聚合(Parent Pipeline))
    • 三、核心语法规则(必须掌握)
      • [3.1 关键参数](#3.1 关键参数)
      • [3.2 语法结构](#3.2 语法结构)
    • 四、高频管道聚合实战(附完整DSL)
      • 场景索引(示例)
      • [4.1 同级管道聚合:avg_bucket(计算桶均值)](#4.1 同级管道聚合:avg_bucket(计算桶均值))
      • [4.2 同级管道聚合:max_bucket(求桶最大值)](#4.2 同级管道聚合:max_bucket(求桶最大值))
      • [4.3 父级管道聚合:derivative(导数/环比)](#4.3 父级管道聚合:derivative(导数/环比))
      • [4.4 父级管道聚合:cumulative_sum(累计求和)](#4.4 父级管道聚合:cumulative_sum(累计求和))
      • [4.5 父级管道聚合:moving_avg(移动平均)](#4.5 父级管道聚合:moving_avg(移动平均))
      • [4.6 高级管道聚合:bucket_script(自定义脚本计算)](#4.6 高级管道聚合:bucket_script(自定义脚本计算))
    • [五、Pipeline Aggregation 典型应用场景(生产高频)](#五、Pipeline Aggregation 典型应用场景(生产高频))
    • [六、Pipeline Aggregation 执行流程图](#六、Pipeline Aggregation 执行流程图)
    • [七、Spring Data Elasticsearch 实现管道聚合](#七、Spring Data Elasticsearch 实现管道聚合)
    • 八、注意事项(避坑指南)
    • 九、总结流程图
    • 总结

|-----------------------------|
| 🌺The Begin🌺点点关注,收藏不迷路🌺 |

前言

在 Elasticsearch 聚合分析场景中,我们经常会遇到基于聚合结果再进行二次计算 的需求,例如:计算各分类平均销量的平均值 、筛选出销售额高于均值的分类、对聚合结果进行导数/累计求和/移动平均等。

普通的聚合(Bucket、Metric)无法实现这类需求,而 Pipeline Aggregation(管道聚合) 正是为此而生------它不直接对文档聚合,而是对其他聚合的结果进行二次加工、计算、处理

本文从核心原理、分类、完整语法、实战案例、典型场景、执行流程全方位讲解,带你彻底掌握 ES 管道聚合,实现复杂数据统计分析。

一、什么是 Pipeline Aggregation?

1.1 定义

管道聚合 是 Elasticsearch 中的二级聚合

  • 输入:其他聚合的结果
  • 输出:新的计算结果
  • 作用:对聚合结果进行数学运算、筛选、排序、预测

1.2 核心特点

  • 基于已有聚合结果计算
  • 不单独访问文档
  • 嵌套在其他聚合内部使用
  • 支持:平均、求和、导数、移动平均、差值、筛选等

1.3 执行流程

文档数据
一级聚合:Bucket/Metric
输出聚合结果
Pipeline聚合:二次计算
输出最终统计结果


二、Pipeline Aggregation 分类(两大类)

2.1 同级管道聚合(Sibling Pipeline)

  • 作用于同一级的聚合结果
  • 输出一个新的同级聚合
  • 典型:avg_bucketsum_bucketmax_bucketmin_bucket

2.2 父级管道聚合(Parent Pipeline)

  • 作用于父聚合中的每一项
  • 输出嵌入到父聚合内部的结果
  • 典型:derivative(导数)、cumulative_sum(累计求和)、moving_avg(移动平均)

三、核心语法规则(必须掌握)

3.1 关键参数

  • buckets_path:指向目标聚合的路径(核心)
  • gap_policy:空值策略
  • format:输出格式

3.2 语法结构

json 复制代码
{
  "aggs": {
    "一级聚合名称": {
      "terms": { "field": "分类字段" },
      "aggs": {
        "指标聚合": { "sum": { "field": "数字字段" } },
        "管道聚合名称": {
          "管道类型": {
            "buckets_path": "指标聚合"
          }
        }
      }
    }
  }
}

四、高频管道聚合实战(附完整DSL)

场景索引(示例)

索引:sales

字段:category(分类)、amount(销售额)、date(日期)


4.1 同级管道聚合:avg_bucket(计算桶均值)

需求 :先按商品分类分组统计销售额 → 再计算所有分类销售额的平均值

json 复制代码
GET /sales/_search
{
  "size": 0,
  "aggs": {
    "group_by_category": {
      "terms": { "field": "category.keyword" },
      "aggs": {
        "total_amount": { "sum": { "field": "amount" } }
      }
    },
    "avg_category_amount": {
      "avg_bucket": {
        "buckets_path": "group_by_category>total_amount"
      }
    }
  }
}

效果:返回所有分类销售额的平均值。


4.2 同级管道聚合:max_bucket(求桶最大值)

json 复制代码
"max_category_amount": {
  "max_bucket": {
    "buckets_path": "group_by_category>total_amount"
  }
}

4.3 父级管道聚合:derivative(导数/环比)

需求 :按天统计销售额 → 计算每日环比增量

json 复制代码
GET /sales/_search
{
  "size": 0,
  "aggs": {
    "group_by_date": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "day"
      },
      "aggs": {
        "daily_amount": { "sum": { "field": "amount" } },
        "daily_diff": {
          "derivative": {
            "buckets_path": "daily_amount"
          }
        }
      }
    }
  }
}

4.4 父级管道聚合:cumulative_sum(累计求和)

需求 :按天统计销售额 → 计算累计销售额

json 复制代码
"cumulative_amount": {
  "cumulative_sum": {
    "buckets_path": "daily_amount"
  }
}

4.5 父级管道聚合:moving_avg(移动平均)

需求 :7日移动平均,用于趋势预测、平滑波动

json 复制代码
"moving_avg_amount": {
  "moving_avg": {
    "buckets_path": "daily_amount",
    "window": 7,
    "model": "simple"
  }
}

4.6 高级管道聚合:bucket_script(自定义脚本计算)

需求:自定义公式计算,如:销售额 * 0.8

json 复制代码
"profit_amount": {
  "bucket_script": {
    "buckets_path": {
      "total": "total_amount"
    },
    "script": "params.total * 0.8"
  }
}

五、Pipeline Aggregation 典型应用场景(生产高频)

场景1:整体统计分析

  • 计算所有部门薪资的平均值
  • 计算各地区订单量总和、最大值、最小值
  • 计算分类销量的均值/总和

场景2:时间序列数据分析(最常用)

  • 日环比、周环比、月环比(derivative)
  • 累计销售额、累计用户量(cumulative_sum)
  • 移动平均、趋势预测(moving_avg)

场景3:数据监控与告警

  • 筛选出超过平均值的异常指标
  • 监控流量突增(导数监控)
  • 计算同比/环比波动

场景4:复杂指标计算

  • 毛利率、利润率
  • 转化率、复购率
  • 自定义公式指标(bucket_script)

场景5:报表与可视化

  • Kibana 可视化图表
  • 运营报表、大屏数据
  • 业务趋势分析

六、Pipeline Aggregation 执行流程图

原始文档
分桶聚合 Terms/DateHistogram
指标聚合 Sum/Avg/Count
Pipeline聚合二次计算
Avg/Max/Derivative/MovingAvg
返回最终聚合结果


七、Spring Data Elasticsearch 实现管道聚合

java 复制代码
NativeSearchQuery query = new NativeSearchQueryBuilder()
    .withAggregation(
        AggregationBuilders.terms("group_by_category")
            .field("category.keyword")
            .subAggregation(AggregationBuilders.sum("total_amount").field("amount"))
    )
    .withAggregation(
        AggregationBuilders.avgBucket("avg_amount", "group_by_category>total_amount")
    )
    .build();

SearchHits<Sales> hits = template.search(query, Sales.class);

八、注意事项(避坑指南)

  1. 必须依赖已有聚合,不能单独使用
  2. buckets_path 路径必须正确
    • 同级:聚合名>子聚合名
    • 父级:直接写子聚合名
  3. 管道聚合无法再被其他管道聚合直接使用
  4. 空桶使用 gap_policy 处理
  5. 大量数据下,移动平均、导数等计算会消耗性能

九、总结流程图



业务统计需求
是否需要二次计算
使用Pipeline聚合
使用普通聚合
Sibling:同级统计 avg/max
Parent:时序统计 环比/累计/移动平均
报表/整体分析
监控/趋势/预测

总结

Pipeline Aggregation(管道聚合) 是 Elasticsearch 实现复杂统计分析 的核心能力,一句话总结:
对聚合结果再聚合,实现二级计算。

核心价值

  • 实现桶级别的数学运算
  • 支持时间序列环比、累计、趋势
  • 满足复杂业务指标、监控大屏、运营报表
  • 是 ES 高阶数据分析必备技能

最常用场景

✅ 分类统计的平均值/总和/最大/最小值

✅ 日环比、周环比、月环比

✅ 累计销售额、累计用户

✅ 移动平均、趋势预测

✅ 自定义指标公式计算

掌握管道聚合,你就能轻松实现企业级数据分析、监控、报表功能!


|---------------------------|
| 🌺The End🌺点点关注,收藏不迷路🌺 |

相关推荐
商业模式源码开发6 小时前
实体门店低获客成本增长案例:3 人转介绍模型 + 消费返还机制落地分析
大数据·商业模式·私域流量
元拓数智7 小时前
智能分析落地卡壳?先补好「数据关系+语义治理」这层技术基建
大数据·分布式·ai·spark·数据关系·语义治理
TDengine (老段)8 小时前
TDengine Tag 设计哲学与 Schema 变更机制
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
sxgzzn9 小时前
新能源场站数智化转型:基于数字孪生与AI的智慧运维管理平台解析
大数据·运维·人工智能
清平乐的技术专栏10 小时前
【Flink学习】(二)Flink 本地环境搭建,运行第一个入门程序
大数据·flink
这是程序猿10 小时前
Spring Boot自动配置详解
java·大数据·前端
ws20190710 小时前
AUTO TECH China 2026广州汽车零部件展:从整机集成迈向核心部件的产业跃升
大数据·人工智能·科技·汽车
humors22110 小时前
从数据到决策:汽车使用成本的精细计算指南
大数据·程序人生
大大大大晴天11 小时前
Flink技术实践:RocksDB 状态后端技术解密
大数据·flink
1892280486112 小时前
NY382固态MT29F32T08GSLBHL8-24QM:B
大数据·服务器·人工智能·科技·缓存