2.X/6. Modeling Your Data

6-2-4. Nested Aggregations

drscg 2017. 9. 23. 15:06

In the same way as we need to use the special nested query to gain access to nested objects at search time, the dedicated nested aggregation allows us to aggregate fields in nested objects:

검색 시에, nested object에 액세스하기 위해, 특별히 nested query를 사용해야 하는 것과 동일한 방식으로, nested object에 있는 field를 aggregation하기 위한, 전용 nested aggregation이 있다.

GET /my_index/blogpost/_search
{
  "size" : 0,
  "aggs": {
    "comments": { 
      "nested": {
        "path": "comments"
      },
      "aggs": {
        "by_month": {
          "date_histogram": { 
            "field":    "comments.date",
            "interval": "month",
            "format":   "yyyy-MM"
          },
          "aggs": {
            "avg_stars": {
              "avg": { 
                "field": "comments.stars"
              }
            }
          }
        }
      }
    }
  }
}

nested aggregation은 nested comments object로 "내려간다".

comments는 comments.data field를 기준으로, 월별로 bucket으로 만들어진다.

stars의 평균은 각 bucket에 대해 계산된다.

The results show that aggregation has happened at the nested document level:

결과는 aggregation이 nested document 수준에서 일어난다는 것을 보여준다.

...
"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
              }
           }
        ]
     }
  }
}
...

  

9월에 1개, 10월에 3개, 총 4개의 comments 가 있다.

reverse_nested Aggregationedit

nested aggregation can access only the fields within the nested document. It can’t see fields in the root document or in a different nested document. However, we can step out of the nested scope back into the parent with a reverse_nested aggregation.

nested aggregation은 nested document내에 있는 field만 액세스할 수 있다. root document나 다른 nested document에 있는 field는 알 수 없다. 그러나, reverse_nested aggregation을 통해, 부모 document로 중첩된 범위(nested scope)를 벗어날(step out) 수 있다.

For instance, we can find out which tags our commenters are interested in, based on the age of the commenter. The comment.age is a nested field, while the tags are in the root document:

예를 들어, 댓글을 단 사용자의 나이를 기준으로, 댓글을 단 사용자가 관심 있어 하는 tags 를 찾을 수 있다.comments.age 는 nested field이지만, tags 는 root document에 있다.

GET /my_index/blogpost/_search
{
  "size" : 0,
  "aggs": {
    "comments": {
      "nested": { 
        "path": "comments"
      },
      "aggs": {
        "age_group": {
          "histogram": { 
            "field":    "comments.age",
            "interval": 10
          },
          "aggs": {
            "blogposts": {
              "reverse_nested": {}, 
              "aggs": {
                "tags": {
                  "terms": { 
                    "field": "tags"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

nested aggregation은 comments 오브젝트로 내려간다.

histogram aggregation은 comment.age field를 기준으로 그룹화해, 10년 간격으로 bucket을 생성한다.

reversed_nested aggregation은 root document로 올라간다.

terms aggregation은 댓글을 단 사용자의 나이 그룹별로, 인기 있는 단어의 수를 센다.

The abbreviated results show us the following:

결과는 아래와 같다.

..
"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 }
                    ]
                 }
              }
           },
...

4개의 댓글이 있다.

 

20 ~ 30세 사이의 사용자가 쓴, 댓글은 2개가 있다.

2개의 블로그 게시물이 해당 댓글과 관련되어 있다.

해당 블로그 게시물에서 인기 있는 tag는 sharescashequities 이다.

When to Use Nested Objectsedit

Nested objects are useful when there is one main entity, like our blogpost, with a limited number of closely related but less important entities, such as comments. It is useful to be able to find blog posts based on the content of the comments, and the nested query and filter provide for fast query-time joins.

nested objects는 댓글처럼 조금 밀접하게 연관된, 하지만 덜 중요한 entity를 가진, 블로그 게시물처럼 하나의 주요 entity가 있을 때 유용하다. 댓글의 내용을 기준으로 블로그 게시물을 찾을 때 유용하다. 그리고 nested query와 filter는 검색 시에 join이 빠르다.

The disadvantages of the nested model are as follows:

nested 모델의 단점은 아래와 같다.

  • To add, change, or delete a nested document, the whole document must be reindexed. This becomes more costly the more nested documents there are.

    nested document를 추가, 수정, 삭제하려면, 전체 document가 재색인 되어야 한다. nested document가 많을수록, 더 많은 비용이 발생한다.

  • Search requests return the whole document, not just the matching nested documents. Although there are plans afoot to support returning the best -matching nested documents with the root document, this is not yet supported.

    검색 request는 일치하는 nested document뿐만 아니라, 전체 document를 반환한다. 가장 일치하는 nested document를 root document와 함께 반환하는 것을 지원할 계획이 진행 중이지만, 아직은 지원되지 않는다.

Sometimes you need a complete separation between the main document and its associated entities. This separation is provided by the parent-child relationship.

가끔, root document와 관련된 entity를 완전히 구분해야 하는 경우가 있다. 이러한 구분은 parent-child relationship 으로 가능하다.


'2.X > 6. Modeling Your Data' 카테고리의 다른 글

6-2-2. Querying a Nested Object  (0) 2017.09.23
6-2-3. Sorting by Nested Fields  (0) 2017.09.23
6-3. Parent-Child Relationship  (0) 2017.09.23
6-3-1. Parent-Child Mapping  (0) 2017.09.23
6-3-2. Indexing Parents and Children  (0) 2017.09.23