在 Elasticsearch 中,聚合(Aggregation)是一种强大的数据分析工具,用于对文档进行分组、统计和计算。根据聚合的结果形式,聚合可以分为 **单桶聚合** 和 **多桶聚合**。
---
### **1. 单桶聚合(Single Bucket Aggregation)**
单桶聚合是指聚合的结果只生成一个桶(bucket),这个桶中可能包含多个文档或子聚合的结果。
#### 特点:
- 只生成一个桶。
- 通常用于对满足特定条件的文档进行过滤或分组。
- 可以在单桶聚合的基础上嵌套其他聚合(子聚合)。
#### 常见的单桶聚合:
- **`filter` 聚合**:根据条件过滤文档,生成一个桶。
```json
{
"aggs": {
"high_value_sales": {
"filter": { "range": { "price": { "gte": 100 } } },
"aggs": {
"avg_price": { "avg": { "field": "price" } }
}
}
}
}
```
这里 `filter` 聚合生成一个桶,包含所有 `price >= 100` 的文档,然后计算这些文档的平均价格。
- **`global` 聚合**:忽略查询条件,对所有文档进行聚合。
```json
{
"aggs": {
"all_products": {
"global": {},
"aggs": {
"avg_price": { "avg": { "field": "price" } }
}
}
}
}
```
这里 `global` 聚合生成一个桶,包含索引中的所有文档。
- **`nested` 聚合**:用于处理嵌套类型的字段,生成一个包含嵌套文档的桶。
```json
{
"aggs": {
"nested_products": {
"nested": { "path": "products" },
"aggs": {
"avg_price": { "avg": { "field": "products.price" } }
}
}
}
}
```
---
### **2. 多桶聚合(Multi Bucket Aggregation)**
多桶聚合是指聚合的结果会生成多个桶(buckets),每个桶代表一个分组或类别。
#### 特点:
- 生成多个桶。
- 每个桶代表一个分组,通常基于字段值、范围、日期等。
- 可以在每个桶中嵌套其他聚合(子聚合)。
#### 常见的多桶聚合:
- **`terms` 聚合**:根据字段的值分组,生成多个桶。
```json
{
"aggs": {
"genres": {
"terms": { "field": "genre.keyword" }
}
}
}
```
这里 `terms` 聚合会根据 `genre` 字段的值生成多个桶,每个桶代表一个不同的 `genre`。
- **`range` 聚合**:根据数值范围分组,生成多个桶。
```json
{
"aggs": {
"price_ranges": {
"range": {
"field": "price",
"ranges": [
{ "to": 50 },
{ "from": 50, "to": 100 },
{ "from": 100 }
]
}
}
}
}
```
这里 `range` 聚合会根据 `price` 字段的值生成多个桶,每个桶代表一个价格范围。
- **`date_histogram` 聚合**:根据日期范围分组,生成多个桶。
```json
{
"aggs": {
"sales_over_time": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
}
}
}
}
```
这里 `date_histogram` 聚合会根据 `date` 字段的值按月分组,生成多个桶。
- **`histogram` 聚合**:根据数值间隔分组,生成多个桶。
```json
{
"aggs": {
"price_histogram": {
"histogram": {
"field": "price",
"interval": 50
}
}
}
}
```
这里 `histogram` 聚合会根据 `price` 字段的值按 50 的间隔分组,生成多个桶。
---
### **单桶聚合 vs 多桶聚合**
| 特性 | 单桶聚合 | 多桶聚合 |
|---------------------|-----------------------------------|-----------------------------------|
| **桶的数量** | 只生成一个桶 | 生成多个桶 |
| **典型用途** | 过滤、全局聚合、嵌套聚合 | 分组、分类、范围统计 |
| **常见聚合类型** | `filter`、`global`、`nested` | `terms`、`range`、`date_histogram` |
| **是否支持子聚合** | 支持 | 支持 |
---
### **总结**
- **单桶聚合**:生成一个桶,通常用于过滤或全局统计。
- **多桶聚合**:生成多个桶,通常用于分组或分类统计。
- 两者都可以嵌套子聚合,实现更复杂的分析需求。
根据你的数据分析需求,选择合适的聚合类型可以帮助你更高效地提取和统计 Elasticsearch 中的数据。