在很多团队中,搜索引擎最早承担的角色只是“查数据”。
但当数据量变大、业务问题变复杂,仅靠列表查询已经远远不够——我们开始需要统计、汇总和分析。
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 字段中,非常适合被前端或报表系统直接消费。
四、报表统计的核心思路 #
几乎所有报表都可以拆解为两个问题:
- 怎么分组?(按什么维度统计)
- 要算什么?(数量、平均值、总和等)
在 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 的几个经验建议 #
- 先想清楚报表长什么样,再写聚合
- 不必一次用很多聚合,先从
terms、sum、avg开始 - 多使用
size: 0,避免不必要的数据传输 - 把聚合结果当成“接口返回值”,而不是“查询副产品”
八、总结 #
Easysearch 的 Aggregations 并不是一个“高级功能”,而是一个每个业务系统都值得尽早使用的基础能力。
只要掌握:
- 如何分组
- 如何计算
- 如何对接可视化
你就已经具备了用 Easysearch 直接产出报表级统计结果的能力。**搜索负责找到数据,聚合负责读懂数据,报表负责讲清楚数据。**这,正是 Easysearch Aggregations 的价值所在。





