1. nested document 설명

Elasticsearch에서 nested document는 복잡한 데이터 구조를 지원하기 위한 특별한 필드 타입이야. 이 타입을 사용하면 하나의 문서 내에서 문서의 리스트를 저장할 수 있게 되는데, 이 리스트 안의 각 아이템을 독립적인 문서로 취급할 수 있어. 즉, 기본적으로 문서 내 문서를 저장하는 것이지.

2. Nested Document의 필요성

Elasticsearch에서 기본적으로는 모든 필드가 flat하게 저장되며, 이는 복잡한 데이터 구조를 표현하기 어렵게 만들어. 예를 들어, 한 게시글에 여러 댓글이 있는 경우를 생각해 보자. 각 댓글이 어떤 게시글에 속하는지, 누가 작성했는지 같은 정보를 처리하기 위해서는 복잡한 데이터 구조가 필요해.

이런 경우에 nested document 타입을 사용하면, 각 댓글을 독립적인 하위 문서로 관리할 수 있어서, 각 댓글에 대한 검색이나 집계를 훨씬 효율적으로 할 수 있게 돼.

3. 예시

예를 들어, 게시글에 대한 Elasticsearch 문서에서 댓글을 nested document로 관리하려면 다음과 같이 정의할 수 있어:

{
  "title": "Elasticsearch Tutorial",
  "content": "Learn how to use Elasticsearch",
  "comments": [
    {
      "content": "Great article!",
      "author_id": "user123",
      "created_at": "2023-05-01T12:00:00Z"
    },
    {
      "content": "Thanks for the info",
      "author_id": "user456",
      "created_at": "2023-05-02T12:00:00Z"
    }
  ]
}

이 문서에서 comments 필드가 nested document 타입으로 설정되어 있을 경우, 각 댓글은 독립된 하위 문서로 취급되어 별도로 색인화되며, 게시글 문서와 함께 저장되지만, 쿼리 시에는 별도의 조건을 적용할 수 있어.

4. 쿼리에서의 활용

nested document에 대한 쿼리는 일반적인 쿼리와 다르게 작성해야 해. Elasticsearch는 nested query를 사용하여 nested field에 대한 쿼리를 수행할 수 있도록 지원해:

{
  "query": {
    "nested": {
      "path": "comments",
      "query": {
        "bool": {
          "must": [
            { "match": { "comments.author_id": "user123" }},
            { "match": { "comments.content": "Great article!" }}
          ]
        }
      }
    }
  }
}