es 对子文档聚合查询
时间: 2023-08-20 07:04:19 浏览: 183
在Elasticsearch中,可以使用Nested和Parent/Child两种方式来进行子文档聚合查询。
1. Nested方式
使用Nested方式进行子文档聚合查询需要先将子文档嵌套在父文档中,然后使用Nested类型进行查询。Nested类型会将嵌套在父文档中的子文档看作一个独立的文档进行处理。
例如,如果我们有一个父文档(books)和一个子文档(authors),其中每个book可以有多个author,那么我们可以使用以下查询来对每个book的author进行聚合:
```
{
"size": 0,
"aggs": {
"books": {
"nested": {
"path": "authors"
},
"aggs": {
"authors": {
"terms": {
"field": "authors.name"
}
}
}
}
}
}
```
这个查询会先使用Nested类型指定子文档路径(authors),然后使用terms aggregation对每个author的name进行聚合。
2. Parent/Child方式
使用Parent/Child方式进行子文档聚合查询需要先将子文档和父文档分别建立索引,并且使用Parent字段来关联两个索引。然后,使用Has Child或Has Parent类型进行查询。
例如,如果我们有一个父文档(books)和一个子文档(authors),其中每个book可以有多个author,那么我们需要先将books和authors分别建立索引,并且使用book的ID作为author的Parent字段。然后,我们可以使用以下查询来对每个book的author进行聚合:
```
{
"size": 0,
"aggs": {
"books": {
"terms": {
"field": "books.title"
},
"aggs": {
"authors": {
"children": {
"type": "authors",
"filter": {
"match_all": {}
}
},
"aggs": {
"names": {
"terms": {
"field": "authors.name"
}
}
}
}
}
}
}
}
```
这个查询会先使用terms aggregation对books进行聚合,然后使用Has Child类型指定子文档类型(authors),并使用match_all filter过滤所有子文档。最后,使用terms aggregation对每个author的name进行聚合。
阅读全文