【Elasticsearch】nested聚合

在 Elasticsearch 中,嵌套聚合(`nested`aggregation)的语法形式用于对嵌套字段(`nested`fields)进行聚合操作。嵌套字段是 Elasticsearch 中的一种特殊字段类型,用于存储数组中的对象,这些对象需要独立于其父文档进行索引和查询。

以下是嵌套聚合的基本语法形式及其组成部分的详细说明:

基本语法

```json

{

"aggs": {

"<nested_aggregation_name>": {

"nested": {

"path": "<nested_field_path>"

},

"aggs": {

"<sub_aggregation_name>": {

"<sub_aggregation_type>": {

"<sub_aggregation_body>"

}

}

}

}

}

}

```

组成部分

  1. `<nested_aggregation_name>`:

• 这是嵌套聚合的名称,由用户自定义,用于在查询结果中标识该聚合。

  1. `nested`:

• 这是嵌套聚合的类型标识符,表明这是一个嵌套聚合。

  1. `path`:

• 指定嵌套字段的路径。嵌套字段路径是从根文档到嵌套字段的完整路径。例如,如果嵌套字段是`resellers`,则路径为`"resellers"`。

  1. `aggs`:

• 在嵌套聚合中,可以定义一个或多个子聚合。子聚合可以是任何类型的聚合(如`min`、`max`、`avg`、`terms`等),用于对嵌套文档进行进一步的分析。

  1. `<sub_aggregation_name>`:

• 子聚合的名称,由用户自定义,用于在查询结果中标识该子聚合。

  1. `<sub_aggregation_type>`:

• 子聚合的类型,例如`min`、`max`、`avg`、`terms`等。

  1. `<sub_aggregation_body>`:

• 子聚合的具体定义,包含子聚合的字段和其他参数。

示例

以下是一个具体的嵌套聚合示例,假设我们有一个产品索引`products`,其中包含一个嵌套字段`resellers`,每个`reseller`有`reseller`(经销商名称)和`price`(价格)两个字段。

创建索引和映射

```json

PUT /products

{

"mappings": {

"properties": {

"resellers": {

"type": "nested",

"properties": {

"reseller": {

"type": "keyword"

},

"price": {

"type": "double"

}

}

}

}

}

}

```

添加文档

```json

PUT /products/_doc/0?refresh

{

"name": "LED TV",

"resellers": [

{

"reseller": "companyA",

"price": 350

},

{

"reseller": "companyB",

"price": 500

}

]

}

```

嵌套聚合查询

  1. 查询所有经销商的最低价格:

```json

GET /products/_search?size=0

{

"aggs": {

"resellers_agg": {

"nested": {

"path": "resellers"

},

"aggs": {

"min_price": {

"min": {

"field": "resellers.price"

}

}

}

}

}

}

```

• `resellers_agg`:嵌套聚合的名称。

• `nested`:指定这是一个嵌套聚合。

• `path`:指定嵌套字段的路径为`resellers`。

• `min_price`:子聚合的名称。

• `min`:子聚合的类型,用于计算最小值。

• `field`:指定聚合操作的字段为`resellers.price`。

  1. 查询特定经销商的最低价格:

```json

GET /products/_search?size=0

{

"aggs": {

"resellers_agg": {

"nested": {

"path": "resellers"

},

"aggs": {

"filter_reseller": {

"filter": {

"bool": {

"filter": [

{

"term": {

"resellers.reseller": "companyB"

}

}

]

}

},

"aggs": {

"min_price": {

"min": {

"field": "resellers.price"

}

}

}

}

}

}

}

}

```

• `filter_reseller`:过滤子聚合的名称。

• `filter`:过滤条件,用于筛选出`resellers.reseller`为`companyB`的文档。

• `term`:过滤条件的类型,用于匹配特定的值。

响应示例

  1. 查询所有经销商的最低价格:

```json

{

"aggregations": {

"resellers_agg": {

"doc_count": 2,

"min_price": {

"value": 350.0

}

}

}

}

```

  1. 查询特定经销商的最低价格:

```json

{

"aggregations": {

"resellers_agg": {

"doc_count": 2,

"filter_reseller": {

"doc_count": 1,

"min_price": {

"value": 500.0

}

}

}

}

}

```

总结

嵌套聚合的语法形式包括以下关键部分:

• `nested`:指定这是一个嵌套聚合。

• `path`:指定嵌套字段的路径。

• 子聚合:在嵌套聚合中嵌套其他聚合操作,用于对嵌套文档进行进一步分析。

通过嵌套聚合,可以对嵌套字段中的文档进行复杂的聚合操作,从而满足复杂的查询需求。

相关推荐
Elasticsearch2 小时前
Elasticsearch:Connector API 教程 - PG 和 ES 的同步
elasticsearch
kida_yuan3 小时前
【岁月留声】知识库检索能力演进史
人工智能·elasticsearch
Aoiner3 小时前
模型部署笔记
大数据·elasticsearch·搜索引擎
silvamux_4 小时前
MiniMax API 调用教程:兼容 OpenAI 写法
java·数据库·elasticsearch
greatofdream8 小时前
git rebase时如何解决merge节点冲突问题
大数据·git·elasticsearch
SelectDB技术团队18 小时前
冷热分层从建到验:Storage Policy 创建、表级与分区级绑定、SHOW TABLETS 验证的完整命令
大数据·数据库·elasticsearch·搜索引擎·数据分析·apache doris·冷热分层
Sayai21 小时前
DataX 离线数据同步实战:Elasticsearch 数据批量导出 MySQL(作业配置、并发调优与定时同步平台化设计)
大数据·mysql·elasticsearch·datax·数据同步
Elastic 中国社区官方博客1 天前
Kibana:创建包含时间序列图表的仪表板
大数据·elasticsearch·搜索引擎·信息可视化·全文检索·kibana
Elastic 中国社区官方博客1 天前
Elastic 线下 Meetup 将于 2026 年 12 月 19 号下午在西安举行
大数据·数据库·elasticsearch·搜索引擎·ai·数据分析·全文检索
SelectDB技术团队1 天前
存算分离建表与 Storage Vault 配置全流程:日志集群从建库到弹性扩缩容的命令链
elasticsearch·日志·数据湖·apache doris·日志数据·数据库选型·多模湖仓