当前位置: 首页 > article >正文

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


http://www.kler.cn/a/534055.html

相关文章:

  • 基于SpringBoot的信息技术知识赛系统的设计与实现(源码+SQL脚本+LW+部署讲解等)
  • 开发板上Qt运行的环境变量的三条设置语句的详解
  • SpringCloud速通教程
  • k8m 是一款轻量级、跨平台的 Kubernetes 仪表板
  • Java BIO详解
  • 基于 Java 开发的 MongoDB 企业级应用全解析
  • Gitee AI上线:开启免费DeepSeek模型新时代
  • 【论文复现】粘菌算法在最优经济排放调度中的发展与应用
  • libdrm移植到arm设备
  • PostgreSQL证书什么样子的?
  • Android studio:顶部导航栏Toolbar
  • 专门记录台式电脑常见问题
  • SpringBoot+Dubbo+zookeeper 急速入门案例
  • vue页面和 iframe多页面无刷新方案和并行 并接入 micro 微前端部分思路
  • 宾馆民宿酒店住宿管理系统+小程序项目需求分析文档
  • QT:对象树
  • 前端在DeepSeek中提问的典型模板
  • RTMP 和 WebRTC
  • 【大数据技术】搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn)
  • 实现动态卡通笑脸的着色器实现
  • 生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (上)
  • Vue Router 客户端路由解决方案:axios 响应拦截(跳转到登录页面)
  • Redis --- 使用zset处理排行榜和计数问题
  • llama_index
  • 蓝桥杯备赛题目练习(一)
  • useEffect和useLayoutEffect有什么区别