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

1. 什么是 Easysearch? #

Easysearch 是一款现代分布式搜索与分析引擎,支持全文检索、结构化检索、聚合分析等能力。它能够处理大规模文档数据,通过灵活的搜索与统计能力帮助开发者构建实时分析、报表展示、业务监控等功能。Easysearch 的聚合功能设计来源于 Elasticsearch 的 Aggregations 框架,可实现高效的数据统计与分组分析。


2. 聚合的基本概念 #

在 Easysearch 中,聚合(Aggregations)是一种能够将数据按照某种规则进行统计与组合的能力。聚合通常不返回具体的匹配文档,而是返回统计结果或分组信息。聚合主要分为:

  • Bucket(桶)聚合:将符合条件的文档分成多个“桶(Bucket)”,类似 SQL 中的 GROUP BY
  • Metric(指标)聚合:对一组文档或桶进行数值计算,如求平均值、总和等。

一个聚合请求典型结构如下:

GET /your_index/_search
{
  "size": 0,
  "aggs": {
    "your_aggregation_name": {
      "AGG_TYPE": {
        ...
      }
    }
  }
}

其中 "size": 0 表示不返回具体文档,只关心聚合结果。


3. 桶聚合:按值分组(terms) #

Bucket 聚合 就是“分桶”,比如按照某个字段的不同值将数据分成不同组,每组对应一个桶。最常用的桶聚合是 terms(词条聚合)

3.1 terms 聚合基础 #

terms 聚合会为某个字段中出现的每个不同值建立一个桶,并统计每个桶内包含的文档数量:

GET logs/_search
{
  "size": 0,
  "aggs": {
    "status_codes": {
      "terms": {
        "field": "status.keyword",
        "size": 5
      }
    }
  }
}

在这个例子中,按 status.keyword 字段的值进行分组统计,返回最频繁的 5 个状态码以及它们对应的文档计数。

解释 #
  • key:每个桶对应的字段值;
  • doc_count:该值对应的文档数量;
  • size:限制返回多少个桶(默认有上限)。

3.2 桶聚合的意义 #

terms 聚合相当于 SQL 中的 GROUP BY 操作,它能将数据分类统计,例如:

  • 按产品类别统计数量;
  • 按响应码统计请求数量;
  • 按用户 ID 统计用户行为分布。

结合其他聚合,还可以进一步对每个分组做数值统计。


4. 指标聚合:计算数值统计(avg / sum / min / max) #

Metric 聚合 是对符合条件的文档或某个桶内的文档进行数值计算,比如求平均值、求和等。Easysearch 支持常见的指标聚合。

4.1 常见的指标聚合类型 #

聚合类型功能
avg计算字段的平均值
sum计算字段值的总和
min找出字段的最小值
max找出字段的最大值

这些指标类似于关系型数据库的统计函数。


4.2 avg(平均值) #

avg 聚合返回一个字段的平均值。例如:

GET products/_search
{
  "size": 0,
  "aggs": {
    "avg_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}

返回结果中 avg_price.value 即为该字段的平均值。

意义:可以快速获知指标中心趋势,例如平均购买金额、平均访问时间等。


4.3 sum(求和) #

sum 聚合返回字段值的总和,例如:

GET deliveries/_search
{
  "size": 0,
  "aggs": {
    "total_weight": {
      "sum": {
        "field": "weight_kg"
      }
    }
  }
}

返回 total_weight.value 即为该字段所有文档的总和。

意义:适合用于计算总收入、总耗时等。


4.4 min / max #

类似 sumavgmin 聚合返回某字段在数据集中的最小值,max 聚合返回最大值,它们用于分析分布范围。


5. 组合聚合示例:Bucket 与 Metric 联合使用 #

指标聚合通常与桶聚合一起使用,先把文档分桶,再在每个桶内做统计。

例如,统计每个状态码的平均响应时间:

GET logs/_search
{
  "size": 0,
  "aggs": {
    "by_status": {
      "terms": {
        "field": "status.keyword"
      },
      "aggs": {
        "avg_resp_time": {
          "avg": {
            "field": "response_time"
          }
        }
      }
    }
  }
}

执行后,每个状态码对应一个桶,并包含该状态码下的平均响应时间。

解释

  • 外层 terms 聚合分组;
  • 内层 avg 聚合在对应桶内计算平均值。

这种模式既能分类又能统计,是构建多维度分析的基础。


6. 聚合结果的可视化实践 #

Easysearch 的聚合结果本质上是结构化的 JSON 数据,这些数据非常适合直接用于可视化展示。实际应用中,我们通常遵循以下流程:

聚合查询 → 获取 buckets → 提取 key / value → 映射为图表数据

下面通过 三个最常见的场景,结合 具体聚合查询与可视化代码示例,说明 Bucket 与 Metric 聚合如何落地使用。


6.1 terms 聚合 + 柱状图:分类统计 #

场景说明 #

统计不同 状态码(status) 的请求数量,并使用柱状图展示。


① Easysearch 聚合查询 #

GET logs/_search
{
  "size": 0,
  "aggs": {
    "status_count": {
      "terms": {
        "field": "status.keyword",
        "size": 10
      }
    }
  }
}

② 聚合返回结果(简化) #

{
  "aggregations": {
    "status_count": {
      "buckets": [
        { "key": "200", "doc_count": 15230 },
        { "key": "404", "doc_count": 312 },
        { "key": "500", "doc_count": 87 }
      ]
    }
  }
}

③ 前端数据提取(JavaScript) #

const buckets = response.aggregations.status_count.buckets;

const xAxisData = buckets.map((item) => item.key);
const seriesData = buckets.map((item) => item.doc_count);

④ 使用 ECharts 渲染柱状图 #

const option = {
  title: {
    text: "请求状态码分布",
  },
  xAxis: {
    type: "category",
    data: xAxisData,
  },
  yAxis: {
    type: "value",
  },
  series: [
    {
      type: "bar",
      data: seriesData,
    },
  ],
};

chart.setOption(option);

📊 效果说明

  • 每个状态码对应一个柱子
  • 柱子的高度即 doc_count
  • 非常适合做 分类统计面板

6.2 terms + avg 聚合 + 柱状图:分类指标分析 #

场景说明 #

统计 每种状态码下的平均响应时间,用于分析性能问题。


① Easysearch 聚合查询 #

GET logs/_search
{
  "size": 0,
  "aggs": {
    "by_status": {
      "terms": {
        "field": "status.keyword"
      },
      "aggs": {
        "avg_response_time": {
          "avg": {
            "field": "response_time"
          }
        }
      }
    }
  }
}

② 返回结果(简化) #

{
  "aggregations": {
    "by_status": {
      "buckets": [
        {
          "key": "200",
          "doc_count": 15230,
          "avg_response_time": { "value": 35.6 }
        },
        {
          "key": "500",
          "doc_count": 87,
          "avg_response_time": { "value": 420.3 }
        }
      ]
    }
  }
}

③ 前端数据处理 #

const buckets = response.aggregations.by_status.buckets;

const xAxisData = buckets.map((b) => b.key);
const seriesData = buckets.map((b) => b.avg_response_time.value);

④ 使用 ECharts 渲染柱状图(平均响应时间) #

const option = {
  title: {
    text: "不同状态码的平均响应时间",
  },
  xAxis: {
    type: "category",
    data: xAxisData,
  },
  yAxis: {
    type: "value",
    name: "ms",
  },
  series: [
    {
      type: "bar",
      data: seriesData,
    },
  ],
};

📌 实践价值

  • 可以快速发现 异常状态码
  • 性能监控 / SLA 分析 的基础方式

6.3 date_histogram 聚合 + 折线图:趋势分析 #

场景说明 #

统计访问量变化趋势,用于流量监控。


① Easysearch 聚合查询 #

GET logs/_search
{
  "size": 0,
  "aggs": {
    "visits_over_time": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "day"
      }
    }
  }
}

② 返回结果(简化) #

{
  "aggregations": {
    "visits_over_time": {
      "buckets": [
        {
          "key_as_string": "2025-01-01",
          "doc_count": 1200
        },
        {
          "key_as_string": "2025-01-02",
          "doc_count": 1780
        },
        {
          "key_as_string": "2025-01-03",
          "doc_count": 2156
        },
        {
          "key_as_string": "2025-01-04",
          "doc_count": 2067
        },
        {
          "key_as_string": "2025-01-05",
          "doc_count": 2654
        }
      ]
    }
  }
}

③ 前端数据处理 #

const buckets = response.aggregations.visits_over_time.buckets;

const xAxisData = buckets.map((b) => b.key_as_string);
const seriesData = buckets.map((b) => b.doc_count);

④ 使用 ECharts 渲染折线图 #

const option = {
  title: {
    text: "每日访问量趋势",
  },
  xAxis: {
    type: "category",
    data: xAxisData,
  },
  yAxis: {
    type: "value",
  },
  series: [
    {
      type: "line",
      data: seriesData,
      smooth: true,
    },
  ],
};

📈 适用场景

  • 访问量趋势分析
  • 业务增长监控
  • 异常流量识别

6.4 可视化实践总结 #

聚合类型常见图表典型用途
terms柱状图 / 饼图分类统计
terms + avg / sum柱状图分类指标分析
date_histogram折线图 / 面积图时间趋势分析

核心思想只有一句话:Bucket 决定“分组维度”,Metric 决定“统计值”,图表只是结果的呈现方式。


7. 总结 #

聚合类型作用
Bucket 聚合对数据分类分组,例如按字段值划分桶
Metric 聚合对数据或分组做统计,例如平均值、总和等

聚合的真正价值在于组合使用:先分组,再对每组做统计,这样才能得到对业务有意义的分析结果。

掌握 termsavgsum 等聚合类型后,你就可以用 Easysearch 构建灵活的数据统计分析与可视化功能,为业务洞察与数据驱动决策提供坚实基础。