Bootstrap

【Elasticsearch】单桶聚合与多桶聚合的区别

 

在 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 中的数据。

;