![](https://i-blog.csdnimg.cn/direct/5bb818264a3d4a51888f2307e52d01d5.jpg)
在 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>"
}
}
}
}
}
}
```
组成部分
- `<nested_aggregation_name>`:
• 这是嵌套聚合的名称,由用户自定义,用于在查询结果中标识该聚合。
- `nested`:
• 这是嵌套聚合的类型标识符,表明这是一个嵌套聚合。
- `path`:
• 指定嵌套字段的路径。嵌套字段路径是从根文档到嵌套字段的完整路径。例如,如果嵌套字段是`resellers`,则路径为`"resellers"`。
- `aggs`:
• 在嵌套聚合中,可以定义一个或多个子聚合。子聚合可以是任何类型的聚合(如`min`、`max`、`avg`、`terms`等),用于对嵌套文档进行进一步的分析。
- `<sub_aggregation_name>`:
• 子聚合的名称,由用户自定义,用于在查询结果中标识该子聚合。
- `<sub_aggregation_type>`:
• 子聚合的类型,例如`min`、`max`、`avg`、`terms`等。
- `<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
}
]
}
```
嵌套聚合查询
- 查询所有经销商的最低价格:
```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`。
- 查询特定经销商的最低价格:
```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`:过滤条件的类型,用于匹配特定的值。
响应示例
- 查询所有经销商的最低价格:
```json
{
"aggregations": {
"resellers_agg": {
"doc_count": 2,
"min_price": {
"value": 350.0
}
}
}
}
```
- 查询特定经销商的最低价格:
```json
{
"aggregations": {
"resellers_agg": {
"doc_count": 2,
"filter_reseller": {
"doc_count": 1,
"min_price": {
"value": 500.0
}
}
}
}
}
```
总结
嵌套聚合的语法形式包括以下关键部分:
• `nested`:指定这是一个嵌套聚合。
• `path`:指定嵌套字段的路径。
• 子聚合:在嵌套聚合中嵌套其他聚合操作,用于对嵌套文档进行进一步分析。
通过嵌套聚合,可以对嵌套字段中的文档进行复杂的聚合操作,从而满足复杂的查询需求。