Elastic Search

Ch03. 데이터 모델링 - 매핑 API

webmaster 2025. 9. 7. 15:12
728x90

매핑은 색인 시, 데이터가 어디에 저장될지를 결정하는 설정이다. 데이터 베이스에서의 스키마에 대응되는 개념으로 인덱스에 추가되는 각 데이터 타입을 구체적으로 정의하는 것이다.

엘라스틱 서치는 기본적으로 스키마리스이기 때문에 명시적으로 필드를 정의하지 않아도 데이터 유형에 따라 필드 데이터 타입에 대한 매핑 정보가 자동으로 생성된다. 단, 자동 매핑 방식은 언뜻 편리해 보이지만 실수로 잘못된 타입으로 지정될 경우 수정할 방법이 없기 때문에 각별하게 사용해야 한다.

매핑 설정 시 고려해야 할 사항

  • 문자열을 분석할 것인가?
  • _source에 어떤 필드를 정의할 것인가?
  • 날짜 필드를 가지는 필드는 무엇인가?
  • 매핑에 정의되지 않고 유입되는 필드는 어떻게 처리할 것인가

매핑 인덱스 만들기

PUT movie_search
{
    "settings": {
        "number_of_shards": 5,
        "number _of_replicas": 1
    },
    "mappings": {
        "_doc": {
            "properties": {
                "movield": {
                    "type": "keyword"
                },
                "movieNm": {
                    "type": "text",
                    "analyzer": "standard"
                },
                "movieNmEn": {
                    "type": "text",
                    "analyzer": "standard"
                },
                "ordtYear": {
                    "type": "integer"
                },
                "openDt": {
                    "type": "integer"
                },
                "typeNm": {
                    "type": "keyword"
                },
                "prdtStatNm": {
                    "type": "keyword"
                },
                "nationAlt": {
                    "type": "keyword"
                },
                "genreAlt": {
                    "type": "keyword"
                },
                "repNationNm": {
                    "type": "keyword"
                },
                "reGenreNm": {
                    "type": "keyword"
                },
                "companies": {
                    "properties": {
                        "companyCd": {
                            "type": "keyword"
                        },
                        "companyNm": {
                            "type": "keyword"
                        }
                    }
                },
                "directors": {
                    "properties": {
                        "peopleNm": {
                            "type": "keyword"
                        }
                    }
                }
            }
        }
    }
}
  • 영화 제목은 분석 가능하도록 text 타입으로, 나머지 필드는 해당 정보를 그대로 보여줄 것이므로 특성에 따라 keyword, integer 타입으로 설정
  • directors와 companies 필드는 내부적으로 또 다른 문서 구조를 가지게 되므로 계층 구조로 설정

매핑 확인

매핑 정보를 확인할 수 있다

GET movie_search/_mapping

매핑 파라미터

색인할 필드의 데이터를 어떻게 저장할지에 대한 다양한 옵션을 제공하며, 이러한 옵션은 필드에 매핑 정보를 설정할 때 유용하게 사용할 수 있다.

Analyzer

  • 해당 필드의 데이터 형태소를 분석하겠다는 의미의 파라미터이다.
  • 색인과 검색 시 지정한 분석기로 형태소 분석을 수행해야 하며, 기본적으로 text 데이터 타입의 필드는 analyzer 매핑 파라미터를 기본적으로 사용해야 한다.
    • 지정하지 않는다면 Standard Analyzer 형태소 분석을 수행

Normalizer

  • term Query에 분석기를 사용하기 위해 사용된다.
  • Keyword 타입 같은 경우 원문 기준 문서가 색인되기 때문에 형태가 다르다면 서로 다른 문서로 인식하게 되는데, normalizer를 통해 분석기에 ascifolding과 같은 필터를 사용하면 같은 데이터로 인식하게 된다.

Boost

  • 필드에 가중치를 부여한다.
  • 가중치에 따라 유사도 점수가 달라지기 때문에 boost 설정 시 검색 결과의 노출 순서에 영향을 준다.
  • 색인 시점에 boost 설정을 하게 된다면 재색인하지 않는 이상 가중치를 변경할 수 없기 땜누에 주의해서 사용해야 한다.(검색 시점에만 사용하길 권장)
  • 최근 Elastic Search는 더이상 색인 시 boost 설정을 할 수 없도록 바뀌었다.

Coerce

  • 색인 시, 자동 변환을 허용할지 여부를 설정하는 파라미터이다.

Copy_to

  • 매핑 파라미터를 추가한 필드의 값을 지정한 필드로 복사한다.
  • keyword 타입의 필드에 copy_to 매핑 파라미터를 사용해 다른 필드로 값을 복사해서 복사한 필드에서는 text 타입을 지정해 형태소 분석을 할 수도 있다.

FieldData

  • 엘라스틱서치가 힙 공간에 생성하는 메모리 캐시.
  • 과거에는 FieldData를 많이 사용했지만 반복적인 메모리 부족 현상과 잦은 GC로 현재는 거의 사용하지 않는다.
    • 현재는 doc_values라는 새로운 형태의 캐시를 제공하며, text 타입의 필드를 제외한 모든 필드는 기본적으로 doc_values 캐시를 사용한다.
  • text 타입의 필드는 집계나 정렬 등의 기능을 수행할 수 없는데, 부득이하게 사용해야 하는 경우 fieldData를 사용할 수 있다.
    • 단 fieldData는 메모리 소모가 크기 때문에 기본적으로 비활성화되어 있다.

doc_values

  • 엘라스틱서치에서 사용하는 기본 캐시. text 타입을 제외한 모든 타입에서 기본적으로 doc_values 캐시를 사용한다.
  • 힙 사용에 대한 부담을 없애고, 운영체제의 파일 시스템 캐시를 통해 디스크에 있는 데이터에 빠르게 접근이 가능(GC 비용 x, 메모리 연산과 비슷)
  • 필드를 집계, 정렬할 필요 없고, 스크립크에서 필드값이 액세스 할 필요가 없다면 디스크 공간을 절약하기 위해 doc_values 옵션을 비활성화할 수 있다.
    • 단, 비활성화된 피드는 인덱스를 재색인하지 않는 이상 변경이 불가능하다.

dynamic

  • 매핑에 필드를 추가할 떄 동적으로 생성할지, 생성하지 않을지를 결정한다.
  • true: 새로 추가되는 필드를 매핑에 추가한다.
  • false: 새로 추가되는 필드를 무시한다.(색인되지 않아 검색할 수 없지만, _source에는 표기된다.)
  • strict: 새로운 필드가 감지되면 예외가 발생하고 문서 자체가 색인되지 않는다. 새로 유입되는 필드는 사용자가 매핑에 명시적 추가해야 한다.

enabled

  • 검색 결과에는 포함하고 싶고 색인을 하고 싶지 않을 떄 사용한다.

Format

  • 날짜/시간을 문자열로 변경할 때 미리 구성된 포맷을 사용할 수 있다.
포맷 날짜 형식 비고
basic_date  YYYYMMdd  년도/월/일
basic_date_time  YYYYMMdd'T' Hmmss. SSSZ 년도/월/일/T/시/분/초/밀리초/Z
basic_time HHmmss.SSS  시/분/초/밀리초/Z
date/strict_date  YYYY-MM-dd  년도/시/분
date_hour _minute_second/
strict_date_hour_minute_second 
YYYY-MM-dd'T'HH:mm:ss 년도/시/분/T/시/분/초
date_hour _minute_second _millis/
strict_date_hour_minute_second_millis
YYYY-MM-dd'T'HH:mm:ss.SSS 년도/시/분/T/시/분/초/밀리초
date_time/strict_date_time  YYYY-MM-dd'T'HH:mm:ss.SSSZZ 년도/시/분/T/시/분/초/ZZ

ignore_above

  • 필드에 저장되는 문자열이 지정한 크기를 넘어서면 빈 값으로 색인한다.(지정 크기가 아닌 빈값 저장임)

ignore_malformed

  • 해당 필드만 무시하고 문서를 색인할 수 있다.

index

  • 필드값을 색인할지를 결정한다. (기본값은 true로 false로 설정 시, 해당 인덱스를 색인하지 않는다.)

fields

  • 다중 필드를 설정할 수 있는 옵션. 
  • 필드 안에 또 다른 필드의 정보를 추가할 수 있어 string 값을 각각 다른 분석기로 처리하도록 설정할 수 있다.

norms

  • 문서의 _score 값 계산에 필요한 정규화 인수를 사용할지 여부를 설정한다.
  • 기본값은 true로 _score계산이 필요 없거나 단순 필터링 용도로 사용하는 필드는 비활성화해서 디스크 공간을 아낄 수 있다.

null_value

  • 색인 필드가 없거나 필드 값이 null이면 색인 시 필드를 생성하지 않는데 해당 옵션을 설정하면 문서에 값이 null이더라도 필드를 생성하고 그에 해당하는 값으로 저장한다

position_increment_gap

  • 배열 형태의 데이터를 색인할 때 검색의 정확도를 높이기 위해 제공하는 옵션이다.
  • 필드 데이터 중 단어와 단어 사이의 간격을 허용할지를 설정한다. 

properties

  • 오브젝트 타입이나 중첩 타입의 스키마를 정의할 때 사용되는 옵션으로 필드의 타입을 매핑한다.
  • 오브젝트 필드 및 중첩 필드에는 properties라는 서브 필드가 있고, 이 값은 object나 중첩을 포함한 모든 데이터 타입이 될 수 있다.

search analyzer

  • 검색 시, 사용할 분석기를 별도로 지정 가능하다.

similarity

  • 유사도 측정 알고리즘을 지정할 수 있다.
  • 기본 측정 방식 알고리즘은 BM25이다.
알고리즘 설명
BM25 Okapi BM25 알고리즘, 엘라스틱 서치의 기본 유사도 측정 알고리즘이다.
classic TF/DF 알고리즘, 문서 내 용어의 갯수와 전체 용어의 갯수를 이용해 유사도 측정
boolean 복잡한 수학적 모델을 사용하지 않고 단순 boolean 연산으로 유사도 측정한다.
socre는 검색어 일치 여부에 따라 결정되며, 검색 결과의 일치 여부에 따라 쿼리의 가중치에 사용된 점수로만 유사도를 계산한다

store

  • 필드의 값을 저장해 검색 결과에 값을 포함하기 위한 매핑 파라미터이다.
  • 기본적으로 엘라스틱서치는 _source에 색인된 문서가 저장되지만, store 매핑 파라미터를 사용하면, 해당 필드를 자체적으로 저장할 수 있다.
  • 해당 매핑 파라미터를 사용하면 디스크를 더 많이 사용한다

term_vector

  • 루씬에서 분석된 용어의 정보를 포함할지 여부를 결정하는 매핑 파라미터이다.
인자 설명
no 텀벡터를 저장하지 않는다
yes 필드와 용어만 저장한다
with_positions 용어, 용어의 시작과 끝 위치를 저장한다
with_offsets 용어, 문자 오프셋을 저장한다
with_positions_offsets 용어, 용어의 시작과 끝 위치, 문자 오프셋을 모두 저장한다

 

728x90