Looly · 更新于 2018-10-20 20:00:47

嵌套-集合

嵌套-集合

如同我们在查询时需要使用nested查询来存取嵌套对象,专门的nested集合使我们可以取得嵌套对象中栏位的集合:

GET /my_index/blogpost/_search?search_type=count
{
  "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`栏位 评论基於`comments.date`栏位被分至各个月份分段 每个月份分段单独计算星号的平均数 结果显示集合发生於嵌套文档层级: ```json ... "aggregations": { "comments": { "doc_count": 4, "by_month": { "buckets": [ { "key_as_string": "2014-09", "key": 1409529600000, "doc_count": 1, "avg_stars": { "value": 4 } }, { "key_as_string": "2014-10", "key": 1412121600000, "doc_count": 3, "avg_stars": { "value": 2.6666666666666665 } } ] } } } ... ``` 此处总共有四个`comments`: 一个在九月以及三个在十月 ## 反向-嵌套-集合 ### 反向嵌套-集合 一个`nested`集合只能存取嵌套文档中的栏位,而无法看见根文档或其他嵌套文档中的栏位。 然而,我们可以_跳出_嵌套区块,藉由`reverse_nested`集合回到父阶层。 举例来说,我们可以发现使用评论者的年龄为其加上`tags`很有趣。 `comment.age`是在嵌套栏位中,但是`tags`位於根文档: ```json GET /my_index/blogpost/_search?search_type=count { "aggs": { "comments": { "nested": { "path": "comments" }, "aggs": { "age_group": { "histogram": { "field": "comments.age", "interval": 10 }, "aggs": { "blogposts": { "reverse_nested": {}, "aggs": { "tags": { "terms": { "field": "tags" } } } } } } } } } } ``` `nested`集合深入`comments`对象 `histogram`集合以`comments.age`栏位聚集成每十年一个的分段 `reverse_nested`集合跳回到根文档 `terms`集合计算每个年龄分段的火红词语 简略的结果显示如下: ```json .. "aggregations": { "comments": { "doc_count": 4, "age_group": { "buckets": [ { "key": 20, "doc_count": 2, "blogposts": { "doc_count": 2, "tags": { "doc_count_error_upper_bound": 0, "buckets": [ { "key": "shares", "doc_count": 2 }, { "key": "cash", "doc_count": 1 }, { "key": "equities", "doc_count": 1 } ] } } }, ... ``` 共有四个评论 有两个评论的发表者年龄介於20至30之间 两个blog文章与这些评论相关 这些blog文章的火红标签是`shares`丶`cash`丶`equities` ### 什麽时候要使用嵌套对象 嵌套对象对於当有一个主要实体(如`blogpost`),加上有限数量的紧密相关实体(如`comments`)是非常有用的。 有办法能以评论内容找到blog文章很有用,且`nested`查询及过滤器提供短查询时间连接(fast query-time joins)。 嵌套模型的缺点如下: * 如欲新增丶修改或删除一个嵌套文档,则必须重新索引整个文档。因此越多嵌套文档造成越多的成本。 * 搜寻请求回传整个文档,而非只有匹配的嵌套文档。 虽然有个进行中的计画要支持只回传根文档及最匹配的嵌套文档,但目前并未支持。 有时你需要完整分离主要文档及其关连实体。 _父-子关系_提供这一个功能。

上一篇: 嵌套排序