在 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`:指定嵌套字段的路徑。
? 子聚合:在嵌套聚合中嵌套其他聚合操作,用于對嵌套文檔進行進一步分析。
通過嵌套聚合,可以對嵌套字段中的文檔進行復雜的聚合操作,從而滿足復雜的查詢需求。?
?