--- title: "Easysearch:第一次用 Aggregations,就能做出报表级统计" date: 2026-01-23 lastmod: 2026-01-23 description: "从零开始学习 Easysearch 聚合分析功能,通过订单状态分布和金额趋势两个实战案例,演示如何结合 ECharts 实现报表级统计与可视化" tags: ["Easysearch", "聚合分析", "数据可视化"] summary: "在很多团队中,搜索引擎最早承担的角色只是“查数据”。 但当数据量变大、业务问题变复杂,仅靠列表查询已经远远不够——我们开始需要统计、汇总和分析。 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" } } } } 这里有两个关键点:" --- 在很多团队中,搜索引擎最早承担的角色只是“查数据”。 但当数据量变大、业务问题变复杂,仅靠列表查询已经远远不够——**我们开始需要统计、汇总和分析**。 Easysearch 提供的 **Aggregations(聚合分析)**,正是用来解决这类问题的核心能力。即使是第一次接触,只要掌握几个基础概念,也可以直接做出**报表级别的统计结果**。 本文将从零开始,带你理解并使用 Easysearch Aggregations,完成两个最常见的统计与可视化实践。 --- ## 一、什么是 Easysearch Easysearch 是由 INFINI Labs 推出的 **开源分布式搜索与分析引擎**,在接口和使用方式上与 Elasticsearch 高度兼容,同时在稳定性、可运维性和企业场景上做了大量增强。 在 Easysearch 中: - **搜索(Search)** 用来找数据 - **聚合(Aggregations)** 用来算数据 如果说搜索解决的是“**有哪些数据**”, 那么聚合解决的就是“**数据整体长什么样**”。 --- ## 二、为什么说 Aggregations 能做“报表级统计” 在传统系统中,报表通常意味着: - 数据分组(按用户、按状态、按时间) - 指标计算(数量、平均值、总和) - 支持图表展示(饼图、柱状图、趋势图) 而在 Easysearch 中,这些能力都集中在 **Aggregations** 里完成,并且: - 不需要导出数据 - 不需要额外的分析数据库 - 在查询阶段即可返回统计结果 一句话总结: **Aggregations = 实时统计引擎 + 报表计算器** --- ## 三、Aggregations 的基本使用方式 一个带聚合的查询,结构非常清晰: ```json { "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 聚合查询 ```json { "size": 0, "aggs": { "order_status": { "terms": { "field": "status", "size": 10 } } } } ``` 该聚合表示: **按订单状态分组,并统计每种状态的订单数量**。 --- ### 3. 聚合返回结果(简化) ```json { "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 饼图需要的数据格式为: ```js const pieData = buckets.map((item) => ({ name: item.key, value: item.doc_count, })); ``` --- ### 5. ECharts 饼图配置示例 ```js 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); ``` ![](/img/knowledge-base/basic/easysearch-aggregations-reporting-statistics/image-1.png) --- ### 6. 报表价值说明 通过该饼图可以快速回答: - 哪种订单状态占比最高? - 是否存在异常状态(例如取消率过高)? - 订单整体结构是否健康? 这正是 **Aggregations + 可视化 = 报表** 的典型体现。 --- ## 六、聚合实践二:每日订单金额趋势(ECharts 折线图) ### 1. 业务需求 按天统计订单总金额,用于观察: - 业务增长趋势 - 活动带来的波动 - 异常日期的金额变化 该场景关注的是 **时间变化趋势**,适合使用 **折线图或柱状图**。 --- ### 2. Easysearch 聚合查询 ```json { "size": 0, "aggs": { "by_day": { "date_histogram": { "field": "order_time", "calendar_interval": "day" }, "aggs": { "total_amount": { "sum": { "field": "amount" } } } } } } ``` 含义是: - 先按天分组 - 再计算每天的订单金额总和 --- ### 3. 聚合返回结果(简化) ```json { "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 } } ] } } } ``` ![](/img/knowledge-base/basic/easysearch-aggregations-reporting-statistics/image-2.png) --- ### 4. 转换为 ECharts 折线图数据 ```js const xAxisData = buckets.map((item) => item.key_as_string); const seriesData = buckets.map((item) => item.total_amount.value); ``` --- ### 5. ECharts 折线图配置示例 ```js 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 的价值所在。