news 2026/4/20 18:57:01

Elasticsearch 聚合入门:像 Excel 透视表一样分析数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Elasticsearch 聚合入门:像 Excel 透视表一样分析数据

👋 你好,数据分析新手!

你是否熟悉 Excel 的透视表?它能轻松地对数据进行分组、求和、求平均,让你从一堆乱麻中快速看出端倪。

今天,我要告诉你一个好消息:Elasticsearch (ES) 也有一个“超级透视表”功能,它叫做“聚合 (Aggregation)”

如果说查询 (query) 是从 ES 的“图书馆”里找书,那么聚合 (aggregation) 就是对这些书进行统计分析,比如“哪个作者的书最多?”、“平均每本书有多少页?”。

这篇文章将带你用最直观的方式,入门 ES 的聚合功能。


🛠️ 聚合的“菜谱”:基本结构

和查询类似,聚合请求也有一个标准的 JSON 结构。我们同样通过_search端点发送,但这次我们把聚合指令放在aggs(aggregations 的缩写) 字段里。

# 基本结构GET /你的索引名称/_search{"size":0, // 设置为0,表示不返回具体文档,只返回聚合结果,更高效"aggs":{//"aggs""aggregations"的缩写"你给结果起的名字":{// 比如"avg_price""聚合类型":{// 比如"avg""字段":"字段名"// 比如"price"}}}}

别担心,下面的例子会让这个“菜谱”变得生动起来。


🧩 核心聚合类型:你的“数据积木”

聚合主要分为两大类,理解了它们,你就理解了聚合的精髓。

1. 桶聚合 (Bucket Aggregation) - “分组”

这是什么?
桶聚合就像 Excel 透视表里的“行”或“列”,它负责将数据分门别类地放进不同的“桶”里。例如,按“商品类别”分组,每个类别就是一个“桶”。

最常用的桶聚合:terms
terms聚合会为你统计每个“桶”里有多少文档。

场景: 统计一个“商品”索引中,每个**类别(category)**下有多少商品。

GET/products/_search{"size":0,"aggs":{"products_by_category":{// 我们给这个聚合结果起个名字"terms":{"field":"category.keyword"// 按 category 字段分组}}}}
  • category.keyword: 通常对文本字段进行分组时,我们使用.keyword后缀,以确保 ES 对整个词进行精确分组,而不是分词。

返回结果可能像这样

{..."aggregations":{"products_by_category":{"buckets":[{"key":"电子产品","doc_count":150},{"key":"家居用品","doc_count":80},{"key":"图书","doc_count":200}]}}}

看,是不是很清晰?ES 告诉你,“电子产品”这个桶里有150个商品,“家居用品”有80个。这就像透视表的行标签和计数!

2. 指标聚合 (Metrics Aggregation) - “计算”

这是什么?
指标聚合就像 Excel 透视表里的“值”区域,它负责对放进“桶”里的数据进行数学计算。例如,求平均值、总和、最大值、最小值等。

常用的指标聚合

  • avg:计算平均值
  • sum:计算总和
  • max/min:计算最大/最小值
  • cardinality:计算不重复值的数量(类似COUNT(DISTINCT column)

场景: 计算所有商品的平均价格(price)

GET/products/_search{"size":0,"aggs":{"average_price":{// 结果名"avg":{// 聚合类型:平均值"field":"price"// 要计算的字段}}}}

返回结果可能像这样

{..."aggregations":{"average_price":{"value":256.8// 直接返回计算出的值}}}

🚀 组合起来!像透视表一样工作

现在,让我们把“桶”和“指标”组合起来,完成一个真正的“透视表”操作。

终极场景统计每个商品类别下的平均价格是多少?

这就像在 Excel 透视表里:

  • :商品类别 (Category) ->terms桶聚合
  • :价格的平均值 (Average of Price) ->avg指标聚合

ES 查询语句

GET/products/_search{"size":0,"aggs":{"avg_price_by_category":{// 第一层聚合:按类别分组(桶)"terms":{"field":"category.keyword"},"aggs":{// 在每个类别的“桶”内部,再进行子聚合"avg_price":{// 给子聚合起个名字"avg":{// 子聚合类型:计算平均值"field":"price"}}}}}}

返回结果可能像这样

{..."aggregations":{"avg_price_by_category":{"buckets":[{"key":"电子产品",// 桶1:电子产品"doc_count":150,"avg_price":{"value":1200.50}// 桶1的平均值},{"key":"家居用品",// 桶2:家居用品"doc_count":80,"avg_price":{"value":150.00}// 桶2的平均值},{"key":"图书",// 桶3:图书"doc_count":200,"avg_price":{"value":45.80}// 桶3的平均值}]}}}

这不就是你想要的透视表结果吗?!清晰、直观,一目了然。


💡 总结与下一步

恭喜你!你已经掌握了 ES 聚合的核心思想:

  1. 桶聚合 (terms):像透视表的行/列,用来分组
  2. 指标聚合 (avg,sum等):像透视表的,用来计算
  3. 组合使用:在桶聚合内部嵌套指标聚合,实现强大的分层分析。

你的入门实践路径

  1. 打开 Kibana 的Dev Tools
  2. 找一个你熟悉的索引(比如网站日志、商品数据等)。
  3. 尝试用terms聚合对某个字段(如国家、城市、分类)进行分组。
  4. 再尝试在分组的基础上,计算某个数值字段(如价格、访问量)的平均值或总和。

ES 的聚合功能远不止于此,还有日期直方图 (date_histogram)、过滤 (filter)、嵌套聚合等更高级的玩法。但掌握了今天的“桶+指标”组合,你已经能解决 80% 的数据分析需求了!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 19:54:35

Amazon重组AI部门:27年老将统领AGI组织

在今天的"亚马逊克里姆林宫学"一集中,AWS发布了一份新闻稿,显示其最具传奇色彩的领导人之一发生了重大变动。在AWS re:Invent大会上宣布Nova 2模型两周后,AWS实用计算高级副总裁Peter DeSantis将把他的两个团队从AWS中调出&#xf…

作者头像 李华
网站建设 2026/4/18 21:27:49

思科自研AI模型正式应用于产品,首先赋能身份安全服务

思科宣布其自主研发的AI模型已准备就绪,并开始为其产品提供支持,首个应用是Duo身份智能服务。思科使用的模型名为"Foundation-Sec-1.1-8B-Instruct"。根据Hugging Face模型市场的描述,这是一个开放权重、拥有80亿参数的指令调优自回…

作者头像 李华
网站建设 2026/4/17 15:59:55

用GCNN增强EEG神经疾病诊断:源码数据集背后的探索

DL00507-使用领域引导图卷积神经网络GCNN增强基于脑电图EEG的神经疾病诊断源码数据集 一种基于图卷积神经网络(GCNN)的新方法,用于改进使用头皮脑电图(EEG)进行神经系统疾病诊断。 尽管脑电图是神经系统疾病诊断中主要…

作者头像 李华
网站建设 2026/4/18 2:56:54

pgconf_asia_2017_logical_replication_us_20171204-1

Logical Replication Internals Agenda What is Logical Replication?Let’s try!ArchitectureRestrictionsTrouble shooting What is Logical Replication? What is Logical Replication? Is PostgreSQL 10 new featuresReplicate per tableReplicate per transaction…

作者头像 李华
网站建设 2026/4/16 23:17:11

leetcode 762. 二进制表示中质数个计算置位

Problem: 762. 二进制表示中质数个计算置位 解题过程 log2计算二进制长度,然后统计1个数,查看集合是否是素数,计算是否是素数,若是则放入集合 Code class Solution { public:int countPrimeSetBits(int left, int right) {int le…

作者头像 李华
网站建设 2026/4/19 16:25:36

为啥yyyy-MM-dd HH:mm:ss的MM和HH设计为大写

yyyy-MM-dd HH:mm:ss 中的大写 MM 和 HH 是 Java 日期格式化中的约定,原因如下: 1. 区分不同的时间单位(主要目的) 月份 (Month) vs 分钟 (Minute) // 大写的 M 表示月份 (Month) // 小写的 m 表示分钟 (minute)SimpleDateForm…

作者头像 李华