在查询的时候,我们使用 nested
查询 就可以获取嵌套对象的信息。同理, nested
聚合允许我们对嵌套对象里的字段进行聚合操作。
GET /my_index/blogpost/_search
{
"size" : 0,
"aggs": {
"comments": { (1)
"nested": {
"path": "comments"
},
"aggs": {
"by_month": {
"date_histogram": { (2)
"field": "comments.date",
"interval": "month",
"format": "yyyy-MM"
},
"aggs": {
"avg_stars": {
"avg": { (3)
"field": "comments.stars"
}
}
}
}
}
}
}
}
-
nested
聚合`进入'' 嵌套的 `comments
对象。 -
comment对象根据 comments.date 字段的月份值被分到不同的桶。
-
计算每个桶内star的平均数量。
从下面的结果可以看出聚合是在嵌套文档层面进行的:
...
"aggregations": {
"comments": {
"doc_count": 4, (1)
"by_month": {
"buckets": [
{
"key_as_string": "2014-09",
"key": 1409529600000,
"doc_count": 1, (1)
"avg_stars": {
"value": 4
}
},
{
"key_as_string": "2014-10",
"key": 1412121600000,
"doc_count": 3, (1)
"avg_stars": {
"value": 2.6666666666666665
}
}
]
}
}
}
...
-
总共有4个
comments
对象 :1个对象在9月的桶里,3个对象在10月的桶里。
nested
聚合 只能对嵌套文档的字段进行操作。
根文档或者其他嵌套文档的字段对它是不可见的。
然而,通过 reverse_nested
聚合,我们可以 走出 嵌套层级,回到父级文档进行操作。
例如,我们要基于评论者的年龄找出评论者感兴趣 tags
的分布。 comment.age
是一个嵌套字段,但 tags
在根文档中:
GET /my_index/blogpost/_search
{
"size" : 0,
"aggs": {
"comments": {
"nested": { (1)
"path": "comments"
},
"aggs": {
"age_group": {
"histogram": { (2)
"field": "comments.age",
"interval": 10
},
"aggs": {
"blogposts": {
"reverse_nested": {}, (3)
"aggs": {
"tags": {
"terms": { (4)
"field": "tags"
}
}
}
}
}
}
}
}
}
}
-
nested
聚合进入comments
对象。 -
histogram
聚合基于comments.age
做分组,每10年一个分组。 -
reverse_nested
聚合退回根文档。 -
terms
聚合计算每个分组年龄段的评论者最常用的标签词。
简略结果如下所示:
..
"aggregations": {
"comments": {
"doc_count": 4, (1)
"age_group": {
"buckets": [
{
"key": 20, (2)
"doc_count": 2, (2)
"blogposts": {
"doc_count": 2, (3)
"tags": {
"doc_count_error_upper_bound": 0,
"buckets": [ (4)
{ "key": "shares", "doc_count": 2 },
{ "key": "cash", "doc_count": 1 },
{ "key": "equities", "doc_count": 1 }
]
}
}
},
...
-
一共有4条评论。
-
在20岁到30岁之间总共有两条评论。
-
这些评论包含在两篇博客文章中。
-
在这些博客文章中最热门的标签是
shares
、cash
、equities
。