跳到主要内容

反向嵌套聚合 reverse_nested

Reverse nested Aggregation

一种特殊的单桶聚合,支持从嵌套文档聚合父文档。实际上,此聚合可以脱离嵌套的块结构,并链接到其他嵌套结构或根文档,这允许嵌套其他聚合,而这些聚合不是嵌套聚合中嵌套对象的一部分。

反向嵌套聚合必须在嵌套聚合中定义。

选项:

  • path-它定义了嵌套对象字段应该连接回的位置。默认值为空,这意味着它重新连接到 root / main document level。path不能包含对嵌套对象字段的引用,该字段位于reverse_nested所在的嵌套聚合的嵌套结构之外。

例如,假设我们有一个包含issues和comments的ticket system index。comments作为嵌套文档内联到issues文档中。映射可能如下所示:

PUT /issues
{
"mappings": {
"issue" : {
"properties" : {
"tags" : { "type" : "keyword" },
"comments" : {
"type" : "nested",
"properties" : {
"username" : { "type" : "keyword" },
"comment" : { "type" : "text" }
}
}
}
}
}
}

以下聚合将返回已发表评论的顶级评论者的用户名,每个顶级评论者将返回用户评论的问题的顶级标签:

GET /issues/_search
{
"query": {
"match_all": {}
},
"aggs": {
"comments": {
"nested": {
"path": "comments"
},
"aggs": {
"top_usernames": {
"terms": {
"field": "comments.username"
},
"aggs": {
"comment_to_issue": {
"reverse_nested": {},
"aggs": {
"top_tags_per_comment": {
"terms": {
"field": "tags"
}
}
}
}
}
}
}
}
}
}

如上所述,反向嵌套聚合被放入嵌套聚合中,因为这是dsl中唯一可以使用反向嵌套聚合的地方。它的唯一目的是连接回嵌套结构中更高级别的父文档。

reverse_nested 聚合,因为尚未定义path,所以它会连接root / main document level。如果mapping中定义了多个分层嵌套对象类型,则反向嵌套聚合可以通过path选项连接回不同的级别

返回

{
"aggregations": {
"comments": {
"doc_count": 1,
"top_usernames": {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets": [
{
"key": "username_1",
"doc_count": 1,
"comment_to_issue": {
"doc_count": 1,
"top_tags_per_comment": {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets": [
{
"key": "tag_1",
"doc_count": 1
}
...
]
}
}
}
...
]
}
}
}
}