시뻘건 개발 도전기

데이터 모델링: 맵핑 api 본문

Reading/엘라스틱서치 실무 가이드

데이터 모델링: 맵핑 api

시뻘건볼때기 2023. 12. 5. 13:42
반응형

엘라스틱서치에서 색인할 때 데이터 유형에 따라 필드에 적절한 데이터 타입을 지정하는 과정을 맵핑이라고한다. 맵핑은 색인될 문서의 데이터 모델링이라고도 할 수 있다. 만약 맵핑 설정을 하지 않으면 엘라스틱서치가 자동으로 필드를 생성하고 타입을 결정한다. 필드 데이터 타입이 자동으로 지정될 경우 실제 운영환경에서 unknown 이슈가 발생될 수도 있다.

 

맵핑 api

맵핑은 색인시 데이터가 어디에 어떻게 저장되는가를 결졍하는 설정이다. 문서에 존재하는 필드의 속성을 정의할 때 각 필드 속성에는 데이터 타입과 메타데이터가 포함된다. 이를 통해 색인 과정에서 문서가 어떻게 역색인으로 변환되는지를 상세하게 정의할 수 있다. 맵핑 정보를 설정할 때는 아래와 같은 사항들을 고려해야한다. 꼭 명시적인 맵핑 설정을 통해 인덱스를 생성하자!

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

맵핑 인덱스 만들기

아래 영화 정보 문서의 구조와 색인할 실제 데이터가 있을 때 인덱스를 생성해보자.

매핑명 필드명 필드 타입
인덱스 키 movieCd keyword
영화제목_국문 movieNm text
영화제목_영문 movieNmEn text
제작연도 prdtYear integer
개봉연도 openDt integer
영화유형 typeNm keyword
제작상태 prdtStatNm keyword
제작국가(전체) nationAlt keyword
장르(전체) genreAlt keyword
대표 제작국가 repNationNm keyword
대표 장르 repGenreNm keyword
영화감독명 directors.peopleNm object -> keyword
제작사코드 companies.companyCd object -> keyword
제작사명 companies.companyNm object -> keyword

 

{
    "movieCd": "20173732",
    "movieNm":"살아남은 아이",
    "movieNmEn": "Last Child",
    "prdtYear": "2017",
    "openDt": "",
    "typeNm":"장편",
    "prdtStatNm":"기타",
    "nationAlt":"한국",
    "genreAlt": "드라마,가족",
    "repNationNm":"한국",
    "repGenreNm": "드라마",
    "directors": [{
        "peopleNm":"신동석"
    }],
    "companies": [
        "companyCd": "",
        "companyNm": ""
    ]
}

 

실제 검색 대상이 되는 필드는 "영화제목"필드이므로 분석 가능하도록 text 타입으로 정의한다. 나머지 필드는 해당 정보를 그대로 보여주기만 할 것이기 때문에 특성에 따라 integer, keyword 타입으로 설정한다. 만들어진 맵핑을 확인하려면 엘라스틱서치에서 제공하는 _mapping api를 사용할 수 있다.

GET movie_search/_mapping

 

 

맵핑 파라미터

맵핑 파라미터는 색인할 필드의 데이터를 어떻게 저장할 것인가에 대한 다양한 옵션을 제공한다. 이러한 옵션은 필드에 맵핑 정보를 설정할 때 유용하게 사용할 수 있다.

  • analyzer
    • 해당 필드의 데이터를 형태소 분석하겠다는 의미.
    • 색인과 검색시 지정한 분석기로 형태소 분석을 수행한다.
    • text 타입의 필드는 기본적으로 사용해야한다.
    • default 분석기는 Standard Analyzer.
  • normalizer
    • term query에 분석기를 사용한다.
      • 예를들어 keyword 타입의 경우 원문을 기준으로 문서가 색인되기 때문에 cafe, Cafe, Café는 서로 다른 문서로 인식된다.
    • 해당 유형을 normalizer을 통해 분석기에 asciifolding과 같은 필터를 사용하면 같은 데이터로 인식되게 할 수 있다.
  • boost
    • 필드에 가중치를 부여한다.
    • 가중치에 따라 유사도 점수(_score)가 달라지기 때문에 boost 설정시 검색결과의 노출 순서에 영향을 준다.
    • 색인 시점에 boost 설정을 하게 된다면 재색인하지 않는 이상 가중치 변경을 할 수 없기 때문에 주의해서 사용해야한다.
    • 가급적 검색 시점에서만 사용하는 것을 권장한다.
    • 최신 엘라스틱서치는 색인시 boost 설정을 할 수 없도록 변경되었다.
  • coerce
    • 색시 자동 변환을 허용할지에 대한 여부를 설정할 수 있다.
      • 예를들어 "10"과 같은 숫자 형태의 문자열이 integer 타입의 필드에 들어온다면 엘라스틱서치는 자동으로 형변환을 수행해서 정상적으로 처리한다.
    • coerce 설정을 미사용으로 변경하면 색인에 실패한다.
  • copy_to
    • 맵핑 파라미터를 추가한 필드의 값을 지정한 필드로 복사한다.
    • keyword 타입의 필드에 copy_to 맵핑 파라미터를 사용해 다른 필드로 값을 복사하면 복사된 필드에서는 text  타입을 지정할 수 있다.
    • 여러 개의 필드 데이터를 하나의 필드에 모아서 전체 검색 용도로 사용할 수 있다.
  • fielddata
    • 엘라스틱서치가 힙 공간에 생성하는 메모리 캐시다.
    • 반복적인 메모리 부족 현상과 잦은 GC가 발생한다.
    • 최신 버전의 엘라스틱서치는 doc_values라는 새로운 형태의 캐시를 제공한다.
    • fielddata를 사용해야만 하는 경우
      • text 타입의 필드는 집계나 정렬 등의 기능을 수행할 수 없으나 필요할 경우 fielddata를 사용할 수 있다.
  • doc_values
    • 엘라스틱서치에서 사용하는 기본 캐시다.
    • text 타입의 필드를 제외한 모든 필드는 기본적으로 doc_values캐시를 사용한다.
    • 힙 사용에 대한 부담을 줄이고 운영체제의 파일 시스템 캐시를 통해 디스크에 있는 데이터에 빠르게 접근할 수 있다.
    • 필드를 정렬, 집계할 필요가 없고 스크립트에서 필드 값에 랙세스할 필요가 없다면 doc_values를 비활성화 할 수 있다.
    • 한 번 비활성화된 필드는 인덱스를 재색인하지 않는 한 변경이 불가능하다.
  • dynamic
    • 맵핑에 필드를 추가할 때 동적으로 생성할지에 대한 여부를 결정한다.
    • 동적 생성 필드의 처리방법에 대한 설정
      • true: 새로 추가되는 필드를 맵핑에 추가한다.
      • false: 새로 추가되는 필드를 무시한다. 검색은 불가능하지만 _source에는 표시된다.
      • strict: 새로운 필드가 감지되면 예외가 발생하고 문서 자체가 색인되지 않는다. 새로 유입되는 필드는 사용자가 맵핑에 명시적으로 추가한다.
  • enabled
    • 검색 결과에 포함하지만 색인은 하고싶지 않을 때 사용한다.
      • 예를들어 일반적인 게시판이라면 제목과 요약 글만 색인하고 날짜와 사용자id는 색인하지 않는다.
    • 색인을 원치 않는 데이터의 맵핑 파라미터 중 enabled를 false로 설정하면 _source에는 검색이 되지만 색인을 하지 않는다.
  • format
    • 엘라스틱서치는 날짜/시간을 문자열로 표시하는데, 문자열로 변경할 때 미리 구성된 포맷을 사용할 수 있다.
    • basic_date: yyyyMMdd
    • basic_date_time: yyyyMMdd'T'HHmmssmSSSZ
    • basic_time: HHmmss,SSS
    • date/strict_date: yyyy-MM-dd
    • date_hour_minute_second/strict_date_hour_minute_second: yyyy-MM-dd'T'HH:mm:ss.
    • date_hour_minute_second_millis/strict_date_hour_minute_second_millis: yyyy-MM-dd'T'HH:mm:ss.SSS.
    • date_time/strict_date_time: yyyy-MM-dd'T'HH:mm:ss.SSSZZ
  • ignore_above
    • 필드에 저장되는 문자열이 지정한 크기를 넘어서면 빈 값으로 색인한다.
    • 지정한 크기만큼 색인되는 것이 아니다.
  • ignore_malformed
    • 엘라스틱서치에서는 잘못된 타입을 색인하려고하면 예외가 발생하고 해당 문서 전체가 색인되지 않지만 이를 무시하고 문서를 색인 할 수 있다.
  • index
    • 필드값을 색인할지를 결정한다.
    • 기본값은 true이며 false로 설정하면 해당 필드를 색인하지 않는다.
  • fields
    • 다중필드(nulti_field)를 설정할 수 있다.
    • 필드 안에 또 다른 필드의 정보를 추가할 수 있어 같은 string 값을 각각 다른 분석기로 처리할 수 있다.
  • norms
    • 문서의 _score 값 계산에 필요한 정규화 인수를 사용할지에 대한 여부를 설정한다.
    • 기본 값은 true다.
    • _score 계산이 필요 없거나 단순 필터링 용도로 사용하는 필드는 false값으로 설정하여 디스크 공간을 절약할 수 있다.
  • null_value
    • 엘라스틱서치는 색인시 문서에 필드가 없거나 필드의 값이 null이면 색인시 필드를 생성하지 않지만 필드를 생성하고 그에 해당하는 값으로 저장할 수 있다.
  • position_increment_gap
    • 배열형태의 데이터를 색인할 때 검색의 정확도를 높이기 위해 제공하는 옵션이다.
    • 필드 데이터 중 단어와 산어 사이의 간격을 허용할지에 대한 여부를 설정한다.
      • 예를들어 데이터가  ["John Abraham'", “Lincon smith"]일 때 "Abraham Lincon"로 검색하더라고 검색이 가능하다.
  • properties
    • 오브젝트타입이나 중첩타입(Nested)의 스키마를 정의할 때 사용한다.
    • 필드의 타입을 맵핑한다.
    • 오브젝트 필드 및 중첩필드에는 properties라는 서브 필드가 있다. 이 properties는 object나 nested를 포함한 모든 데이터 타입이 될 수 있다.
  • search_analyzer
    • 일반적으로는 색인/검색시 같은 분석기를 사용하지만 서로 다른 분석기를 사용하고 싶은 경우 search_analyzer를 설정할 수 있다.
  • similarity
    • 유사도 측정 알고리즘을 지정한다.
    • 기본 알고리즘은 BM25이다.
      • BM25: Okapi BM25알고리즘이다.
      • classic: TF/IDF알고리즘이다. 문서 내 용어의 개수와 전체 용어의 개수를 이용해 유사도를 계산한다.
      • boolean: 복잡한 수학적 모델을 사용하지않고 단순히 boolean 연산으로 유사도를 측정한다. score는 검색어의 일치여부 에따라 결정되며, 검색결과의 일치여부에따라 쿼리의 가중치에 사용된 점수로만 유사도를 계산한다.
  • store
    • 필드의 값을 저장해 검색 결과에 값을 포함하기 위한 맵핑 파라미터다.
    • 기본적으로 _source에 색인된 문서를 저장하지만 필드를 자체적으로 저장할 수 있다.
    • 디스크 공간을 더 많이 사용한다.
  • term_vector
    • 용어의 정보를 포함할지에 대한 여부를 결정한다.
    • 설정 가능한 인자
      • no: 텀벡터를 저장하지 않는다.
      • yes: 필드와 용어만 저장한다.
      • with_positions: 용어, 용어의 시작과 끝 위치를 저장한다.
      • with_offsets: 용어, 문자 오프셋을 저장한다.
      • with_positions_offsets:용어, 용어의 시작과 끝 위치, 문자 오프셋을 저장한다.
반응형

'Reading > 엘라스틱서치 실무 가이드' 카테고리의 다른 글

데이터 모델링: 데이터 타입  (0) 2023.12.09
데이터 모델링: 메타 필드  (1) 2023.12.08
엘라스틱서치 api  (1) 2023.12.04
엘라스틱서치 용어  (1) 2023.12.01
키바나 설치  (0) 2023.12.01
Comments