콘텐츠로 이동

Elasticsearch 매핑과 인덱스 (Mapping)

Elasticsearch에 문서를 넣기 전에 "문서의 각 필드를 어떻게 저장하고 검색할 것인가"를 정하는 작업이 매핑(Mapping) 이에요. 문서는 필드들의 집합이고, 각 필드는 저마다 데이터 타입을 갖습니다. 매핑은 이 필드 목록을 정의하는 일이라, 검색이 어떻게 동작할지의 뼈대를 결정해요. 이 페이지는 소스 문서 Elasticsearch Mapping 를 바탕으로 설명해요.

개요

매핑은 "문서와 그 필드가 어떻게 저장·인덱싱되는지"를 정의하는 과정입니다. 각 필드의 데이터 타입을 정하고, 문서의 메타데이터(_source 같은)를 어떻게 다룰지도 함께 지정해요. 매핑을 어떻게 잡느냐에 따라 전문검색 필드가 되는지, 벡터 필드가 되는지, 정렬·집계용 keyword가 되는지가 갈립니다.

핵심 개념

동적 매핑(Dynamic Mapping)과 명시적 매핑(Explicit Mapping)

동적 매핑은 문서를 넣으면 Elasticsearch가 필드의 타입을 스스로 감지해 매핑을 만들어 주는 방식이에요. 빠르게 시작하기 좋지만, 자동 추론이 특정 용도에 최적이 아닐 수 있어요.

명시적 매핑은 개발자가 각 필드의 타입을 직접 지정하는 방식입니다. 운영(프로덕션) 환경에서 권장되는데, 데이터를 어떻게 인덱싱할지 완전히 통제할 수 있기 때문이에요. 예를 들어 어느 문자열 필드를 전문검색용 text로, 어떤 걸 정렬·집계용 keyword로 둘지 정할 수 있어요.

실무에서는 둘을 섞는 게 흔해요. 아는 필드는 명시적으로, 나머지는 동적으로 맡기는 방식입니다.

푸시 필드: 같은 필드를 다르게

같은 문자열 필드를 두 가지 방식으로 인덱싱하는 멀티필드(multi-field) 가 유용합니다. 예를 들어 한 필드를 전문검색용 text와 정렬·집계용 keyword로 동시에 두는 거죠.

런타임 필드와 매핑 갱신

런타임 필드(Runtime fields) 는 재인덱싱 없이 스키마를 바꾸는 방법이에요. 인덱스를 작게 유지하지만 검색 성능은 느려지는 트레이드오프가 있어요.

매핑은 일반적으로 이미 매핑된 필드는 바꿀 수 없고 재인덱싱이 필요해요. 단, 새 필드 추가, 기존 필드에 멀티필드 추가, 일부 매핑 파라미터 갱신은 가능합니다.

매핑 폭발 방지

동적 매핑으로 문서마다 새 필드가 계속 생기면 매핑이 무한히 커지는 매핑 폭발(mapping explosion) 이 날 수 있어요. 이는 메모리 부족으로 이어질 수 있으므로, mapping limit settings로 필드 수 제한을 걸어 방지합니다.

실제 적용 (데이터스케쳐스)

  • dense_vector 필드 매핑 — 임베딩 결과(1536차원)를 저장할 필드를 명시적으로 매핑합니다.
  • text + keyword 멀티필드 — 검색용 text와 정렬·필터용 keyword를 함께 두어, 정확한 어휘 매칭과 메타데이터 필터링을 한 문서에서 지원합니다.
  • 명시적 매핑 — 아는 필드는 직접 지정하고, 나머지는 동적 매핑으로 맡겨 운영 안정성을 확보합니다.
  • 날짜 필드 — 문서 생성일을 date로 매핑해 "최근 문서만" 범위 필터를 겁니다.

더 알아보기