Elasticsearch: Object vs Nested 타입 완벽 정리

Elasticsearch에서 Object와 Nested 타입JSON 객체(Object) 데이터를 저장하고 검색하는 방식을 결정하는 중요한 개념입니다.

Object 타입: 객체 내부의 필드들을 독립적으로 색인
Nested 타입: 객체 내부의 필드들을 하나의 단위로 유지하며 별도 저장

이번 글에서는 Object와 Nested 타입의 차이, 각 타입의 데이터 저장 방식, 검색 방식, 그리고 실전 예제까지 상세히 알아보겠습니다.


1. Object와 Nested의 차이점

타입 특징 검색 방식
Object JSON 객체를 필드별로 분리하여 색인 일반 Match Query 사용
Nested JSON 객체를 독립된 문서처럼 저장 Nested Query 사용 필요

2. Object 타입 이해하기

🔹 Object 타입이란?

  • JSON 객체 내부의 필드들을 독립적으로 색인
  • 하위 필드들을 분리하여 저장하기 때문에 부정확한 검색 결과 발생 가능

📌 예제 1: Object 타입 매핑 설정

PUT movie
{
  "mappings": {
    "properties": {
      "characters": {
        "properties": {
          "name": { "type": "text" },
          "age": { "type": "byte" },
          "side": { "type": "keyword" }
        }
      }
    }
  }
}

📌 예제 2: Object 데이터 저장

PUT movie/_doc/1
{
  "characters": {
    "name": "Iron Man",
    "age": 46,
    "side": "superhero"
  }
}

characters 객체 내부의 필드들이 각각 색인됨

📌 예제 3: Object 필드 검색

GET movie/_search
{
  "query": {
    "match": {
      "characters.name": "Iron Man"
    }
  }
}

Object 타입에서는 일반 Match Query 사용 가능


3. Object 타입의 문제점

Object 타입을 배열 형태로 저장할 때, 필드 간의 관계가 유지되지 않음

📌 예제 4: Object 타입을 배열로 저장

PUT movie/_doc/2
{
  "title": "The Avengers",
  "characters": [
    { "name": "Iron Man", "side": "superhero" },
    { "name": "Loki", "side": "villain" }
  ]
}

📌 예제 5: "Loki"이면서 "villain"인 문서 검색 (Object 타입)

GET movie/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "characters.name": "Loki" } },
        { "match": { "characters.side": "villain" } }
      ]
    }
  }
}

문제 발생: "Loki"가 "superhero"로 저장된 문서도 검색됨!

💡 이유:

  • Object 타입은 모든 필드를 개별적으로 저장
  • "characters.name": "Loki" 와 "characters.side": "villain"이 같은 객체인지 확인 불가능

4. Nested 타입으로 해결하기

🔹 Nested 타입이란?

  • JSON 객체 내부의 필드들을 하나의 단위로 저장
  • 각 객체를 별도 문서로 저장하여 관계 유지 가능
  • 검색 시 Nested Query를 사용해야 함

📌 예제 6: Nested 타입 매핑 설정

PUT movie
{
  "mappings": {
    "properties": {
      "characters": {
        "type": "nested",
        "properties": {
          "name": { "type": "text" },
          "side": { "type": "keyword" }
        }
      }
    }
  }
}

📌 예제 7: Nested 데이터 저장

PUT movie/_doc/3
{
  "title": "The Avengers",
  "characters": [
    { "name": "Iron Man", "side": "superhero" },
    { "name": "Loki", "side": "villain" }
  ]
}

📌 예제 8: "Loki"이면서 "villain"인 문서 검색 (Nested 타입)

GET movie/_search
{
  "query": {
    "nested": {
      "path": "characters",
      "query": {
        "bool": {
          "must": [
            { "match": { "characters.name": "Loki" } },
            { "match": { "characters.side": "villain" } }
          ]
        }
      }
    }
  }
}

정확한 문서만 검색됨!

💡 이유:

  • Nested 필드는 각 객체를 개별 문서처럼 저장
  • "characters.name": "Loki"와 "characters.side": "villain"이 같은 객체에 속하는지 확인 가능

5. Object vs Nested 비교

타입 특징 검색 방식
Object 객체 내부의 필드들이 개별적으로 색인됨 일반 Match Query 사용
Nested 객체 내부의 필드들이 한 단위로 유지됨 Nested Query 사용 필요
Object 필드 검색 문제 필드 간 관계가 유지되지 않아 부정확한 검색 결과 발생 가능 Loki가 superhero로 저장된 문서도 검색됨
Nested 필드 해결 객체 단위로 저장되어 정확한 검색 가능 Loki가 villain인 경우만 검색됨

6. 정리

Object 타입 JSON 객체의 필드를 독립적으로 저장 일반 Match Query 사용 가능
Nested 타입 JSON 객체 내부 필드 간 관계를 유지하여 저장 Nested Query 사용 필수
Object 타입 문제점 같은 필드 값이 포함된 다른 객체도 검색됨 잘못된 검색 결과 발생 가능
Nested 타입 해결책 각 객체를 별도 문서처럼 저장하여 관계 유지 정확한 검색 가능

7. 학습 가이드

1️⃣ Object 타입과 Nested 타입을 각각 사용하여 데이터를 저장하고 검색 실습
2️⃣ Object 타입에서 부정확한 검색 결과가 발생하는지 테스트
3️⃣ Nested Query를 사용하여 정확한 검색 결과 도출
4️⃣ Object 필드와 Nested 필드를 활용한 검색 최적화 연습


8. 마무리

Elasticsearch에서 Object와 Nested 타입을 올바르게 선택하는 것은 데이터 검색의 정확성을 결정하는 중요한 요소입니다.
Object 타입검색이 간편하지만 필드 관계를 유지하지 못함
Nested 타입객체 단위의 관계를 유지하지만, Nested Query를 사용해야 함

다음 학습에서는 Nested Query의 성능 최적화 및 Aggregation 활용법을 다루겠습니다! 🚀

+ Recent posts