매핑 (Mapping)
매핑 (Mapping)
매핑(Mapping)은 문서와 그 문서가 담고 있는 필드가 어떻게 저장되고 색인되는지를 정의하는 과정이에요.
각 문서는 여러 필드의 집합이고, 필드는 저마다 데이터 타입을 갖습니다. 데이터를 매핑할 때는 문서에 들어가는 필드 목록을 담은 매핑 정의(mapping definition) 를 만들게 됩니다. 매핑 정의에는 또 _source 같은 메타데이터 필드도 포함되는데, 이 필드들은 문서와 연결된 메타데이터가 어떻게 처리되는지를 정해줘요.
데이터 여정에서 어디에 있는지에 따라 동적 매핑(dynamic mapping) 과 명시적 매핑(explicit mapping) 을 사용해 데이터를 정의합니다. 예를 들어 기본값을 쓰고 싶지 않은 필드나, 어떤 필드가 생성될지 더 세밀하게 제어하고 싶을 때는 명시적으로 매핑할 수 있죠. 그리고 나머지 필드는 Elasticsearch가 동적으로 매핑하도록 둘 수 있어요. 같은 인덱스에서 동적 매핑과 명시적 매핑을 함께 쓰는 것은, 데이터 안에 알고 있는 필드와 모르는 필드가 섞여 있을 때 특히 유용합니다.
참고
7.0.0 이전에는 매핑 정의에 타입 이름(type name)이 포함되어 있었어요. Elasticsearch 7.0.0부터는 기본 매핑을 더 이상 허용하지 않습니다. 자세한 내용은 매핑 타입의 제거 문서를 참고하세요.
동적 매핑을 사용하면 Elasticsearch가 문서의 필드 데이터 타입을 자동으로 감지해서 매핑을 만들어줍니다. 새 필드를 가진 문서를 추가로 색인하면 Elasticsearch가 그 필드들을 자동으로 추가해 주죠. 최상위 매핑뿐 아니라 내부의 object 및 nested 필드에도 필드를 추가할 수 있어요. 동적 매핑 덕분에 빠르게 시작할 수 있지만, 필드 타입을 자동으로 추론하다 보니 특정 사용 사례에는 최적이 아닌 결과가 나올 수도 있습니다.
동적 템플릿을 사용하면 매칭 조건에 따라 동적으로 추가되는 필드에 적용되는 커스텀 매핑을 정의할 수 있어요.
명시적 매핑은 각 필드의 데이터 타입을 직접 지정해서 매핑을 정의하는 방식입니다. 데이터가 어떻게 색인되는지 완전히 제어할 수 있기 때문에 운영 환경(production)에서는 이 방식을 권장합니다.
직접 매핑을 정의하면 다음과 같은 것들이 가능해져요.
- 어떤 문자열 필드를 전문(full-text) 필드로 취급할지 정의
- 어떤 텍스트 필드를 시맨틱 검색 머신러닝 모델이 자동으로 벡터화할지 정의
- 숫자·날짜·지리 정보를 담는 필드가 어떤 것인지 정의
- 자동으로 감지되지 않는 데이터 타입(예:
geo_point,geo_shape) 사용 - 커스텀 날짜 포맷을 포함한 날짜 값 포맷 선택
- 동적으로 추가되는 필드의 매핑을 제어하는 커스텀 규칙 생성
- 부분 매칭(partial matching)에 최적화된 필드 구성
- 언어별 텍스트 분석 수행
팁
같은 필드를 목적에 따라 서로 다르게 색인하는 것이 유용할 때가 많아요. 예를 들어 문자열 필드를 전문 검색용
text필드로도, 정렬·집계용keyword필드로도 색인하고 싶을 수 있죠. 또는 사용자 입력을 담은 문자열 필드의 내용을 처리할 때 두 개 이상의 언어 분석기를 쓰기로 할 수도 있어요.
런타임 필드를 사용하면 재색인 없이 스키마 변경을 할 수 있습니다. 런타임 필드를 색인된 필드와 함께 쓰면 리소스 사용량과 성능의 균형을 잡을 수 있어요. 이 경우 인덱스는 더 작아지지만 검색 성능은 더 느려집니다.
매핑 옵션 실험해 보기
검색 요청에서 런타임 필드 정의를 통해 다양한 매핑 옵션을 실험해 볼 수 있어요. 또한 검색 요청 중 매핑의 값을 덮어써서 인덱스 매핑 값의 실수를 고칠 수도 있습니다.
사전에 알고 있는 필드는 인덱스를 만들 때 명시적으로 매핑하는 것이 좋아요. 데이터가 진화함에 따라 언제든 매핑에 새 필드를 추가하는 것도 가능하지만요.
기존 매핑을 업데이트하려면 Update mapping API를 사용합니다.
대부분의 경우 이미 매핑된 필드의 매핑은 변경할 수 없어요. 매핑을 바꾸려면 재색인이 필요합니다.
다만 다음 조건에서는 매핑을 업데이트할 수 있습니다.
- 기존 매핑에 새 필드를 언제든 추가할 수 있음 (동적 또는 명시적으로)
- 기존 필드에 새 멀티 필드를 추가할 수 있음
- 매핑 업데이트 전에 색인된 문서는 업데이트되거나 재색인되기 전까지 새 멀티 필드에 값이 없어요. 매핑 변경 이후에 색인된 문서는 자동으로 새 멀티 필드에 값이 채워집니다.
- 특정 데이터 타입의 기존 필드에 대해 일부 매핑 파라미터는 업데이트할 수 있음
인덱스에 필드를 너무 많이 정의하면 매핑 폭발(mapping explosion) 이 발생할 수 있어요. 매핑 폭발은 메모리 부족(Out Of Memory) 오류와 회복하기 어려운 상황을 만들 수 있습니다.
새 문서가 들어올 때마다 새 필드가 생기는 경우(예: 동적 매핑을 쓰는 경우)를 생각해 볼게요. 새 필드가 매번 인덱스 매핑에 추가되면서 매핑이 점점 커질 수 있고, 이게 문제가 됩니다.
매핑 한도 설정을 사용하면 (수동으로든 동적으로든) 생성되는 필드 매핑의 수를 제한해서 문서가 매핑 폭발을 일으키지 않도록 막을 수 있어요.