Elasticsearch: 매핑(Mappings) 이해하기

Elasticsearch에서 **매핑(Mappings)**은 인덱스 내 문서의 필드 유형 및 분석 방법을 정의하는 중요한 요소입니다.
동적 매핑(Dynamic Mapping): 자동으로 필드 타입을 생성
명시적 매핑(Explicit Mapping): 직접 필드 타입을 정의

이번 글에서는 매핑의 개념, 동적 매핑과 명시적 매핑의 차이, 그리고 필드 타입 설정 방법을 상세히 알아보겠습니다.


1. Elasticsearch의 매핑(Mappings) 개념

🔹 매핑이란?

  • Elasticsearch에서 문서의 각 필드에 대한 데이터 타입을 정의하는 과정입니다.
  • 인덱스를 생성할 때 매핑을 설정하면 필드의 타입을 명확히 지정하여 데이터의 일관성을 유지할 수 있습니다.
  • 매핑 정보는 GET <인덱스명>/_mapping 명령어로 확인할 수 있습니다.

📌 매핑 조회 예제

GET books/_mapping

🔹 결과 예제 (자동 매핑 적용 후)

{
  "books": {
    "mappings": {
      "properties": {
        "title": {
          "type": "text"
        },
        "author": {
          "type": "text"
        },
        "category": {
          "type": "keyword"
        },
        "publish_date": {
          "type": "date"
        },
        "pages": {
          "type": "long"
        }
      }
    }
  }
}

📌 설명:

  • title, author → text (검색 가능)
  • category → keyword (정확한 값 비교)
  • publish_date → date (ISO 8601 형식)
  • pages → long (정수)

2. 동적(Dynamic) 매핑

🔹 동적 매핑이란?

Elasticsearch는 새로운 필드가 문서에 추가될 경우 자동으로 매핑을 생성하는 기능을 제공합니다.
즉, 사전에 필드를 정의하지 않아도 문서를 색인하면 자동으로 매핑이 설정됩니다.

📌 예제 1: books 인덱스 없이 문서 입력

PUT books/_doc/1
{
  "title": "Romeo and Juliet",
  "author": "William Shakespeare",
  "category": "Tragedies",
  "publish_date": "1562-12-01T00:00:00",
  "pages": 125
}

📌 자동 매핑 결과 확인

GET books/_mapping

🔹 자동 매핑 결과

  • title, author: text
  • category: keyword
  • publish_date: date
  • pages: long

3. 명시적(Explicit) 매핑

🔹 명시적 매핑이란?

  • 데이터가 인덱싱되기 전에 필드 타입을 미리 정의하는 방식입니다.
  • 자동 매핑은 필드 타입이 의도와 다르게 설정될 수 있으므로, 중요한 필드는 명시적으로 설정하는 것이 좋습니다.
  • 특히 숫자, 날짜, 키워드 필드는 명확한 설정이 필요합니다.

📌 예제 2: 명시적 매핑 설정

PUT books
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "author": {
        "type": "text"
      },
      "category": {
        "type": "keyword"
      },
      "publish_date": {
        "type": "date"
      },
      "pages": {
        "type": "integer"
      }
    }
  }
}

🔹 설명

  • title, author: text (검색 최적화)
  • category: keyword (필터링 및 정렬 가능)
  • publish_date: date (날짜 필드)
  • pages: integer (정수값)

📌 새로운 문서 입력 (매핑 유지됨)

PUT books/_doc/2
{
  "title": "Hamlet",
  "author": "William Shakespeare",
  "category": "Tragedies",
  "publish_date": "1603-01-01T00:00:00",
  "pages": 200
}

📌 매핑 확인

GET books/_mapping

🔹 결과: 기존 설정된 필드 타입이 유지됨 ✅


4. 기존 인덱스에 필드 추가

Elasticsearch에서는 기존 인덱스에 새로운 필드를 추가할 수 있지만, 기존 필드의 타입 변경은 불가능합니다.

📌 예제 3: 기존 인덱스에 publisher 필드 추가

PUT books/_mapping
{
  "properties": {
    "publisher": {
      "type": "keyword"
    }
  }
}

📌 매핑 확인

GET books/_mapping

🔹 결과: publisher 필드가 keyword 타입으로 추가됨 ✅

하지만 기존 필드의 타입 변경은 불가능

PUT books/_mapping
{
  "properties": {
    "pages": {
      "type": "float"  ❌ (에러 발생)
    }
  }
}

이미 설정된 필드 타입은 변경 불가능 → 새로운 인덱스를 만들어 데이터를 재색인해야 함


5. 주요 데이터 타입 정리

Elasticsearch에서 사용할 수 있는 주요 데이터 타입을 정리하면 다음과 같습니다.

데이터 타입 설명
text 전문 검색(Full-Text Search)용 필드
keyword 정확한 값 비교, 필터링, 정렬
integer 정수값
long 큰 정수값
float 소수점 포함 숫자
double 높은 정밀도의 소수점 숫자
date 날짜 필드 (ISO 8601)
boolean true/false 값
object JSON 객체 저장
nested 다중 필드(Nested Documents)

6. 정리

개념 설명
동적 매핑 (Dynamic Mapping) 문서가 입력될 때 자동으로 필드 타입을 생성
명시적 매핑 (Explicit Mapping) 필드 타입을 사전에 정의하여 데이터의 일관성 유지
기존 인덱스에 필드 추가 가능 여부 ✅ 새로운 필드는 추가 가능
기존 필드 타입 변경 가능 여부 ❌ 기존 필드 타입 변경 불가능 (재색인 필요)

7. 학습 가이드

1️⃣ 동적 매핑과 명시적 매핑을 비교하며 실습
2️⃣ 다양한 필드 타입을 정의하고 검색 결과 비교
3️⃣ keyword와 text 필드의 차이를 이해하고 적절히 사용
4️⃣ 기존 필드 타입 변경이 불가능하므로, 새로운 인덱스를 생성하고 데이터 재색인 연습


8. 마무리

Elasticsearch에서 **매핑(Mappings)**은 데이터를 효율적으로 저장하고 검색하는 데 중요한 역할을 합니다.
특히 keyword vs text, 동적 매핑 vs 명시적 매핑, 기존 필드 타입 변경 불가능 등의 개념을 이해하고 올바르게 활용하는 것이 중요합니다.

다음 학습에서는 Nested & Object 타입을 활용한 문서 구조 설계 방법을 다루겠습니다! 🚀

+ Recent posts