📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

在很多团队中,搜索引擎最早承担的角色只是“查数据”。
但当数据量变大、业务问题变复杂,仅靠列表查询已经远远不够——我们开始需要统计、汇总和分析

Easysearch 提供的 Aggregations(聚合分析),正是用来解决这类问题的核心能力。即使是第一次接触,只要掌握几个基础概念,也可以直接做出报表级别的统计结果

本文将从零开始,带你理解并使用 Easysearch Aggregations,完成两个最常见的统计与可视化实践。


一、什么是 Easysearch #

Easysearch 是由 INFINI Labs 推出的 开源分布式搜索与分析引擎,在接口和使用方式上与 Elasticsearch 高度兼容,同时在稳定性、可运维性和企业场景上做了大量增强。

在 Easysearch 中:

  • 搜索(Search) 用来找数据
  • 聚合(Aggregations) 用来算数据

如果说搜索解决的是“有哪些数据”,
那么聚合解决的就是“数据整体长什么样”。


二、为什么说 Aggregations 能做“报表级统计” #

在传统系统中,报表通常意味着:

  • 数据分组(按用户、按状态、按时间)
  • 指标计算(数量、平均值、总和)
  • 支持图表展示(饼图、柱状图、趋势图)

而在 Easysearch 中,这些能力都集中在 Aggregations 里完成,并且:

  • 不需要导出数据
  • 不需要额外的分析数据库
  • 在查询阶段即可返回统计结果

一句话总结:

Aggregations = 实时统计引擎 + 报表计算器


三、Aggregations 的基本使用方式 #

一个带聚合的查询,结构非常清晰:

{
  "size": 0,
  "aggs": {
    "my_agg": {
      "terms": {
        "field": "status"
      }
    }
  }
}

这里有两个关键点:

  • size: 0:不关心原始文档,只要统计结果
  • aggs:定义所有统计规则

聚合的结果会统一返回在 aggregations 字段中,非常适合被前端或报表系统直接消费。


四、报表统计的核心思路 #

几乎所有报表都可以拆解为两个问题:

  1. 怎么分组?(按什么维度统计)
  2. 要算什么?(数量、平均值、总和等)

在 Easysearch 中,对应的是两类最基础的聚合:

  • Bucket 聚合:负责“分组”
  • Metric 聚合:负责“计算指标”

下面通过两个实践场景来说明。


五、聚合实践一:订单状态分布(ECharts 饼图) #

1. 业务需求 #

统计订单在不同状态下的数量分布,例如:

  • 已支付(paid)
  • 已发货(shipped)
  • 已完成(completed)
  • 已取消(canceled)

该场景关注的是 结构占比,非常适合使用 饼图 展示。


2. Easysearch 聚合查询 #

{
  "size": 0,
  "aggs": {
    "order_status": {
      "terms": {
        "field": "status",
        "size": 10
      }
    }
  }
}

该聚合表示:
按订单状态分组,并统计每种状态的订单数量


3. 聚合返回结果(简化) #

{
  "aggregations": {
    "order_status": {
      "buckets": [
        { "key": "paid", "doc_count": 320 },
        { "key": "shipped", "doc_count": 210 },
        { "key": "completed", "doc_count": 180 },
        { "key": "canceled", "doc_count": 45 }
      ]
    }
  }
}

4. 转换为 ECharts 数据结构 #

ECharts 饼图需要的数据格式为:

const pieData = buckets.map((item) => ({
  name: item.key,
  value: item.doc_count,
}));

5. ECharts 饼图配置示例 #

const option = {
  title: {
    text: "订单状态分布",
    left: "center",
  },
  tooltip: {
    trigger: "item",
    formatter: "{b}: {c} 单 ({d}%)",
  },
  legend: {
    orient: "vertical",
    left: "left",
  },
  series: [
    {
      name: "订单数量",
      type: "pie",
      radius: "60%",
      center: ["50%", "55%"],
      data: pieData,
    },
  ],
};

chart.setOption(option);


6. 报表价值说明 #

通过该饼图可以快速回答:

  • 哪种订单状态占比最高?
  • 是否存在异常状态(例如取消率过高)?
  • 订单整体结构是否健康?

这正是 Aggregations + 可视化 = 报表 的典型体现。


六、聚合实践二:每日订单金额趋势(ECharts 折线图) #

1. 业务需求 #

按天统计订单总金额,用于观察:

  • 业务增长趋势
  • 活动带来的波动
  • 异常日期的金额变化

该场景关注的是 时间变化趋势,适合使用 折线图或柱状图


2. Easysearch 聚合查询 #

{
  "size": 0,
  "aggs": {
    "by_day": {
      "date_histogram": {
        "field": "order_time",
        "calendar_interval": "day"
      },
      "aggs": {
        "total_amount": {
          "sum": {
            "field": "amount"
          }
        }
      }
    }
  }
}

含义是:

  • 先按天分组
  • 再计算每天的订单金额总和

3. 聚合返回结果(简化) #

{
  "aggregations": {
    "by_day": {
      "buckets": [
        {
          "key_as_string": "2026-01-01",
          "total_amount": { "value": 15230 }
        },
        {
          "key_as_string": "2026-01-02",
          "total_amount": { "value": 18740 }
        },
        {
          "key_as_string": "2026-01-03",
          "total_amount": { "value": 20281 }
        },
        {
          "key_as_string": "2026-01-03",
          "total_amount": { "value": 23298 }
        }
      ]
    }
  }
}


4. 转换为 ECharts 折线图数据 #

const xAxisData = buckets.map((item) => item.key_as_string);
const seriesData = buckets.map((item) => item.total_amount.value);

5. ECharts 折线图配置示例 #

const option = {
  title: {
    text: "每日订单金额趋势",
  },
  tooltip: {
    trigger: "axis",
  },
  xAxis: {
    type: "category",
    data: xAxisData,
  },
  yAxis: {
    type: "value",
    name: "金额",
  },
  series: [
    {
      name: "订单金额",
      type: "line",
      data: seriesData,
      smooth: true,
    },
  ],
};

chart.setOption(option);

6. 报表价值说明 #

通过该趋势图可以直观看到:

  • 业务是否持续增长
  • 哪些日期存在明显波动
  • 是否需要进一步下钻分析异常点

这类 时间序列报表 是 Aggregations 在真实业务中最常见、也是最有价值的用法之一。


七、第一次用 Aggregations 的几个经验建议 #

  • 先想清楚报表长什么样,再写聚合
  • 不必一次用很多聚合,先从 termssumavg 开始
  • 多使用 size: 0,避免不必要的数据传输
  • 把聚合结果当成“接口返回值”,而不是“查询副产品”

八、总结 #

Easysearch 的 Aggregations 并不是一个“高级功能”,而是一个每个业务系统都值得尽早使用的基础能力

只要掌握:

  • 如何分组
  • 如何计算
  • 如何对接可视化

你就已经具备了用 Easysearch 直接产出报表级统计结果的能力。**搜索负责找到数据,聚合负责读懂数据,报表负责讲清楚数据。**这,正是 Easysearch Aggregations 的价值所在。