聚合基础

在 Elasticsearch 中,聚合(Aggregation)是一种强大的数据分析工具,允许用户对数据进行分组、计算和汇总。通过聚合,用户可以从大量数据中提取有用的统计信息、趋势和见解。聚合是搜索请求的一部分,可以在搜索结果中包含聚合的结果,而不影响实际的文档返回。

1. 聚合的基本概念

  • 聚合:将数据分组并对每个组进行统计计算的过程。
  • 桶聚合(Bucket Aggregation):将文档分组到不同的桶中,每个桶包含满足某些条件的文档。
  • 度量聚合(Metric Aggregation):计算单个数字值(如平均值、总和、最大值等)来描述数据。
  • 管道聚合(Pipeline Aggregation):对聚合结果进行进一步处理,例如计算百分比或生成复杂的度量。

2. 常见的聚合类型

桶聚合(Bucket Aggregation)

桶聚合用于将文档分组到不同的桶中。每个桶代表一组满足某些条件的文档。桶聚合常用于数据分组和分类。

  • terms 聚合:按字段的唯一值对文档进行分组。
  • range 聚合:按字段值的范围对文档进行分组。
  • histogram 聚合:按字段值的固定区间对文档进行分组。
  • date_histogram 聚合:按日期字段的时间区间对文档进行分组。
度量聚合(Metric Aggregation)

度量聚合用于计算数据的统计信息。常见的度量聚合包括:

  • avg 聚合:计算字段的平均值。
  • sum 聚合:计算字段的总和。
  • minmax 聚合:计算字段的最小值和最大值。
  • stats 聚合:提供字段的总数、平均值、最大值、最小值和标准差。
  • percentiles 聚合:计算字段的百分位数。
管道聚合(Pipeline Aggregation)

管道聚合用于处理已计算的聚合结果。它对聚合的结果进行进一步的处理和计算。例如:

  • bucket_script 聚合:对桶聚合结果应用脚本计算自定义度量。
  • bucket_sort 聚合:对桶进行排序。

3. 示例查询

计算字段的平均值
POST /products/_search
{
  "size": 0,
  "aggs": {
    "average_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}

在这个示例中,avg 聚合用于计算 price 字段的平均值。

按类别分组并计算每个类别的平均价格
POST /products/_search
{
  "size": 0,
  "aggs": {
    "by_category": {
      "terms": {
        "field": "category.keyword"
      },
      "aggs": {
        "average_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

在这个示例中,terms 聚合用于按 category 字段进行分组,并对每个类别计算 price 字段的平均值。

按价格范围分组
POST /products/_search
{
  "size": 0,
  "aggs": {
    "price_ranges": {
      "range": {
        "field": "price",
        "ranges": [
          { "to": 50 },
          { "from": 50, "to": 100 },
          { "from": 100 }
        ]
      }
    }
  }
}

在这个示例中,range 聚合用于按 price 字段的指定范围对文档进行分组。

4. 总结

  • 桶聚合:用于将文档分组到不同的桶中,根据字段值、范围、直方图等进行分组。
  • 度量聚合:用于计算字段的统计信息,如平均值、总和、最小值、最大值等。
  • 管道聚合:对已计算的聚合结果进行进一步处理和计算。

聚合功能使得 Elasticsearch 不仅能进行复杂的搜索,还能在搜索结果中提供强大的数据分析能力。通过合理使用不同类型的聚合,可以从大数据集中提取出有价值的信息和趋势。