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

👋 你好,数据分析新手!

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

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

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

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


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

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

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

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


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

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

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

这是什么?

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

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

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

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

返回结果可能像这样

json 复制代码
{
  ...
  "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)

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

返回结果可能像这样

json 复制代码
{
  ...
  "aggregations": {
    "average_price": {
      "value": 256.8 // 直接返回计算出的值
    }
  }
}

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

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

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

这就像在 Excel 透视表里:

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

ES 查询语句

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

返回结果可能像这样

json 复制代码
{
  ...
  "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% 的数据分析需求了!

相关推荐
Elastic 中国社区官方博客1 小时前
为 Elastic Cloud Serverless 和 Elasticsearch 引入统一的 API 密钥
大数据·运维·elasticsearch·搜索引擎·云原生·serverless
vastsmile3 小时前
(R)26.04.23 hermes agent执行本地命令超级慢的原因
开发语言·elasticsearch·r语言
herinspace8 小时前
如何解决管家婆辉煌零售POS中显示的原价和售价不一致?
网络·人工智能·学习·excel·语音识别·零售
OtIo TALL8 小时前
Java进阶(ElasticSearch的安装与使用)
java·elasticsearch·jenkins
Elastic 中国社区官方博客12 小时前
Jina embeddings v3 现已在 Gemini Enterprise Agent Platform Model Garden 上可用
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·jina
l1t12 小时前
duckdb excel插件和rusty_sheet插件在python中的不同表现
开发语言·python·excel
agilearchitect12 小时前
Matlab导入Excel表格教程:从基础到进阶全攻略
数据结构·其他·matlab·excel
AC赳赳老秦12 小时前
OpenClaw与Excel联动:批量读取/写入数据,生成可视化报表
开发语言·python·excel·产品经理·策略模式·deepseek·openclaw
前端若水13 小时前
Git 撤销与恢复完全指南(超级详细版)
大数据·git·elasticsearch
做cv的小昊13 小时前
【TJU】研究生应用统计学课程笔记(4)——第二章 参数估计(2.1 矩估计和极大似然估计、2.2估计量的优良性原则)
人工智能·笔记·考研·数学建模·数据分析·excel·概率论