-
ElasticSearch - 매핑(mapping)ElasticSearch 2024. 9. 22. 22:08반응형
매핑
문서의 구조를 나타내는 정보
ElasticSearch는 스키마리스가 아니라 미리 정의하지 않아도 될 뿐이다.종류 정의 독적 매핑(Dynamic Mapping) 처음 색인되는 문서를 바탕으로 매핑 정보를 ElasticSearch가 동적으로 생성 정적 매핑(Static Mapping) 문서의 매핑 정보를 미리 정의 동적 매핑
어떤 문서가 색인될지 스키마를 미리 정의 하지 않아도 된다.
{ "type": "book", "title": "elasticsearch essential", "author": "alden", "rating": 5.0 }
위와같은 문서를 색인한다고 가정해보겠다. 4가지의 필드들이 존재한다.
GET /library/_mapping { "library": { "mappings": { "author": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "rating": { "type": "float" } } } }
author의 경우 문자열이기 때문에 text로 되어있으며, rating의 경우는 float타입으로 설정이 되어있다.
맨처음 색인되는 문서를 보고 동적으로 매핑을 생성하게된다.
동적 매핑에 의해 매핑 정보가 생성된 후에는 타입이 안 맞을 경우 파싱 에러가 발생한다.
동적매핑 뿐 아니라 매핑 후에 타입이 맞지 않는 경우 파싱에러가 발생한다.
{ "type": "book", "title": "linux kernel", "author": "alden", "rating": "4.0" }
이와같이 rating필드에 "4.0"으로 색인을 한다면
{ "error": { "root_cause": [ { "type": "mapper_parsing_exception", "reason": "failed to parse" } ], "type": "mapper_parsing_exception", "reason": "failed to parse", "caused_by": { "type": "not_x_content_exception", "reason": "Compressor detection ..." } }, "status": 400 }
이와같이 파싱에러가 발생하게 된다.
처음에 색인된 문서에 의해 floating으로 색인이 되었지만 "4.0"과같이 text형식이 들어온다면 파싱에러가 발생하게 된다.
정적 매핑
어떤 문서가 색인될지 스키마를 미리 정의한다.
PUT /library { "mappings": { "properties": { "title": { "type": "text" }, "rating": { "type": "double" } } } }
동적 매핑과 다르게 인덱스를 생성할때 매핑정보를 미리 넣어준다.
title의 경우는 text, rating의 경우에는 double형식으로 지정해준다.
{ "type": "book", "title": "elasticsearch essential", "author": "alden", "rating": 5.0 }
여기서 지정하지 않은 type과 author의 경우는 동적매핑으로 실행이 된다.
반드시 타입 지정이 필요한 경우에만 정적 매핑으로 지정해주면 된다.
정적 매핑이 도움이 되는 경우
- 정확한 데이터 타입 관리가 필요한 경우
- 데이터 필드가 고정된 형식이어야 하는 경우 정적 매핑은 매우 유용합니다. 예를 들어, rating 필드는 항상 float 또는 double이어야 한다고 가정할 때, 정적 매핑을 통해 이 필드가 항상 올바른 타입으로 저장되도록 강제할 수 있습니다. 잘못된 타입(예: 문자열)이 들어오면 오류가 발생하기 때문에 데이터 일관성을 보장할 수 있습니다.
- 성능 최적화
- 미리 매핑을 정의하면 Elasticsearch가 데이터를 저장할 때 필드 타입을 자동으로 추론할 필요가 없기 때문에, 성능 면에서 이점이 있습니다. 데이터가 많을 경우 자동으로 매핑하는 과정에서 오버헤드가 발생할 수 있기 때문에, 정적 매핑을 사용하면 불필요한 매핑 추론 작업을 피할 수 있습니다.
- 매핑 변화로 인한 오류 방지
- 자동 매핑(dynamic mapping)을 사용할 경우, Elasticsearch가 데이터를 처음으로 인덱싱할 때 필드 타입을 자동으로 결정합니다. 하지만 같은 필드에 대해 다른 데이터 타입이 들어올 경우 매핑 충돌(mapping conflict)이 발생할 수 있습니다. 정적 매핑은 이를 미연에 방지할 수 있습니다.
- 복잡한 데이터 구조 처리
- 복잡한 데이터 구조를 다룰 때, 특히 다중 필드(multi-fields), 중첩 필드(nested fields), 또는 객체(object)와 같은 복잡한 구조를 미리 정의하는 것이 필요할 수 있습니다. 이러한 구조는 자동 매핑보다는 정적 매핑을 통해 명시적으로 설정하는 것이 더 안전합니다.
- 특정 분석기가 필요한 경우
- 필드에 대해 특별한 분석기(analyzer)나 필터(token filter)를 적용하고자 할 때, 정적 매핑이 필요합니다. 자동 매핑으로는 Elasticsearch가 기본 분석기를 사용하기 때문에, 예를 들어 특정 언어 처리나 사용자 정의 분석기를 적용하려면 정적 매핑을 통해 필드를 명시적으로 정의해야 합니다.
정적 매핑의 예시
PUT /library { "mappings": { "properties": { "title": { "type": "text", "analyzer": "standard" }, "author": { "type": "keyword" }, "published_date": { "type": "date", "format": "yyyy-MM-dd" }, "rating": { "type": "double" } } } }
이 예시에서:
- title 필드는 text 타입으로 정의되고, 기본 standard 분석기를 사용하도록 설정되었습니다.
- author 필드는 keyword 타입으로 설정되어 정확한 일치 검색에 사용됩니다.
- published_date 필드는 date 타입으로 지정되며, "yyyy-MM-dd" 형식을 따릅니다.
- rating 필드는 double 타입으로 설정되어 숫자형 데이터를 저장할 수 있도록 합니다.
결론
정적 매핑은 다음과 같은 경우에 도움이 됩니다:
- 데이터 일관성을 유지하고 잘못된 데이터 입력을 방지할 때
- 성능을 최적화하고 매핑 추론 과정을 줄일 때
- 매핑 충돌을 방지하고, 특정 데이터 구조를 강제할 때
- 복잡한 필드 분석 및 구조화를 필요로 할 때
반응형'ElasticSearch' 카테고리의 다른 글
ElasticSearch - 검색과정 (0) 2024.09.24 ElasticSearch - 색인과정 한눈에 보기 (0) 2024.09.23 ElasticSearch - 인덱스와 샤드 (0) 2024.09.22 Docker로 Kibana ElasticSearch 설치 후 연동 (0) 2024.09.19 Docker를 활용하여 Kibana 설치하기 (0) 2024.09.19 - 정확한 데이터 타입 관리가 필요한 경우