인덱스 매핑
인덱스 매핑 (Mapping)
매핑은 문서와 그 안의 필드가 어떻게 저장되고 색인될지를 정의하는 과정이에요. 각 문서는 필드의 모음이고, 필드는 저마다 데이터 타입이 있어요. 매핑 정의를 만들면 문서에 해당하는 필드 목록을 규정하고, _source 같은 메타데이터 필드를 어떻게 다룰지도 정할 수 있어요. Elasticsearch를 데이터에 맞게 조율하는 출발점이라고 볼 수 있어요.
출처: 공식문서 — Mapping
동적 매핑과 명시 매핑
매핑을 정의하는 방식은 크게 두 가지예요.
- 동적 매핑(Dynamic mapping) — Elasticsearch가 문서의 필드 데이터 타입을 자동으로 감지해 매핑을 만들어 줘요. 새 필드를 가진 문서를 색인하면 필드도 자동으로 추가되죠. 시작이 빠르지만, 자동 타입 추론이라 특정 사용 사례에는 결과가 최적이 아닐 수 있어요.
- 명시 매핑(Explicit mapping) — 필드마다 데이터 타입을 직접 지정해 정의해요. 운영 환경에서는 이 방식을 권장해요. 데이터가 어떻게 색인되는지 완전히 제어할 수 있으니까요.
동적 템플릿을 쓰면 동적으로 추가되는 필드에 조건에 맞는 매핑을 자동 적용하는 커스텀 규칙도 만들 수 있어요. 확실한 필드는 명시로, 나머진 동적으로 두는 혼합 방식도 유용해요.
명시 매핑으로 할 수 있는 것들을 짚어 볼게요. 어떤 문자열 필드를 전체 텍스트로 다룰지, 시맨틱 검색 모델이 자동 벡터화할 텍스트 필드는 무엇인지, 숫자·날짜·지리 위치를 담을 필드를 정할 수 있어요. 또 자동 감지되지 않는 geo_point·geo_shape 같은 타입, 커스텀 날짜 형식, 부분 일치에 최적화된 필드, 언어별 텍스트 분석까지 제어해요.
같은 필드를 여러 방식으로 색인하기
같은 필드를 용도에 따라 다르게 색인하는 게 흔하고 유용해요. 예를 들어 문자열 필드를 전체 텍스트 검색용 text와 정렬·집계용 keyword 두 가지로 동시에 색인할 수 있어요. 사용자 입력이 담긴 문자열 필드에는 둘 이상의 언어 분석기를 적용할 수도 있고요. 이게 바로 멀티필드(multi-fields) 개념이에요.
매핑 갱신 제약
이미 매핑된 필드의 매핑은 대부분 바꿀 수 없어요. 바꾸려면 reindexing(재색인)이 필요하죠. 다만 몇 가지는 예외적으로 갱신할 수 있어요.
- 언제든, 동적·명시적으로 새 필드를 추가할 수 있어요.
- 기존 필드에 새 멀티필드를 추가할 수 있어요. (추가 이전에 색인된 문서는 재색인하거나 갱신되기 전까지 새 멀티필드 값을 갖지 않아요.)
- 특정 데이터 타입의 기존 필드라면 일부 매핑 파라미터를 갱신할 수 있어요.
매핑 폭발 (Mapping explosion) 주의
인덱스에 필드를 너무 많이 정의하면 매핑 폭발이 나요. 매번 새 문서가 새 필드를 들고 오는 동적 매핑 상황에서, 필드마다 매핑에 추가되면서 매핑이 계속 자라나 메모리 부족 오류로 이어질 수 있어요. 매핑 한도 설정으로 수동·자동 생성되는 필드 매핑 수를 제한해 이런 상황을 막을 수 있어요.
런타임 필드
재색인 없이 스키마를 바꾸고 싶다면 런타임 필드(runtime fields) 를 쓸 수 있어요. 검색 요청 안에서만 정의하는 필드로, 색인된 필드와 함께 쓰면 리소스 사용과 성능의 균형을 잡을 수 있어요. 인덱스는 더 작아지지만 검색 성능은 느려지는 트레이드오프가 있죠. 검색 요청에서 런타임 필드를 정의해 매핑 옵션을 실험하거나, 색인 매핑 값을 요청 시점에 덮어쓰는 보정도 가능해요.