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

【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>`:

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

2. `nested`:

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

3. `path`:

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

4. `aggs`:

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

5. `<sub_aggregation_name>`:

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

6. `<sub_aggregation_type>`:

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

7. `<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`。

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

```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

      }

    }

  }

}

```

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

```json

{

  "aggregations": {

    "resellers_agg": {

      "doc_count": 2,

      "filter_reseller": {

        "doc_count": 1,

        "min_price": {

          "value": 500.0

        }

      }

    }

  }

}

```

总结

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

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

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

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

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

 


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

相关文章:

  • 62. Linux内核移植
  • 2.7作业
  • GPU-Z重磅更新,Blackwell架构全面支持
  • 02.06 网络编程_概述
  • ElasticSearch入门
  • 使用线性回归模型逼近目标模型 | PyTorch 深度学习实战
  • Day67:类的继承
  • 树莓派5添加摄像头 在C++下调用opencv
  • Junit5使用教程(6)--高级特性2
  • HTML学习之CSS三种引入方式
  • 基于JavaWeb开发的java Springboot实现教务管理系统
  • 介绍10个比较优秀好用的Qt相关的开源库
  • Linux后台运行进程
  • 网络安全 | 什么是XSS跨站脚本攻击?
  • 如何利用 Python 爬虫按关键字搜索淘宝商品
  • C++基础系列【5】namespace using
  • JAVA异步的TCP 通讯-客户端
  • 【STM32系列】利用MATLAB配合ARM-DSP库设计FIR数字滤波器(保姆级教程)
  • Shell-变量及注释
  • Qt修仙之路2-1 炼丹初成
  • JS的几种具体异常类型(报错)
  • 半导体物理与器件篇8 光电器件
  • elementui:el-table支持搜索、切换分页多选功能,以及数据回显
  • 如何使用Python的Matplotlib绘制图表?
  • 计算机毕业设计hadoop++hive微博舆情预测 微博舆情分析 微博推荐系统 微博预警系统 微博数据分析可视化大屏 微博情感分析 微博爬虫 知识图谱
  • 机器学习数学基础:15.分块矩阵