본문 바로가기

언어/Java

ElasticSearch 스터디 정리 (2) - 데이터 모델링

개요

엘라스틱서치에서는 색인 할때 문서의 데이터 유형에 따라 필드에 적절한 데이터 타입을 지정해야 한다. 이 과정을 매핑이라고 하며, 이는 데이터 모델링이라 할 수 있다. 매핑은 데이터베이스의 스키마에 대응하는 개념이라고 할수 있다(데이터 타입을 구체적으로 정의하는 일)

매핑 API 이해

문서에 존재하는 필드의 속성을 정의할 때 각 필드 속성에는 데이터 타입과 메타데이터가 포함된다. 이를 통해서 색인 과정에서 어떻게 역색인 변환되는지 상세하게 정의 할 수 있다. 엘라스틱서치는 기본적으로 스키마리스이기 때문에 명시적으로 필드를 정의하지 않아도 데이터 유형에 따라 필드 데이터 타입에 대한 매핑 정보가 자동 생성 되지만, 실수로 잘못된 타입을 지정된 경우 수정 불가능하다.

아래 예제를 보자,

## document 1
{
  "movieCode": "20191218",
  "movieName": "GoodDayToday"
}
## document 2
{
  "movieCode": "TX003",
  "movieName": "GoodDayToday"
}

매핑 설정 없이 문서를 인덱스에 추가시, movieCode가 숫자 타입으로 자동 매핑되고, 2번째 문서 추가시 오류가 날 수도 있다.

매핑된 인덱스 생성하기

아래와 같은 방식으로 인덱스 생성시 매핑을 정의 할 수 있다.

## PUT movie_search
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  },
  "mappings": {
    "_doc": {
      "properties": {
        "movieCode": {
          "type": "keyword"
        },
        "movieName": {
          "type": "text",
          "analyzer": "standard"
        },
      }
    }
  }
}

매핑 확인

이미 생성된 인덱스의 매핑은 엘라스틱서치에서 제공하는 API로 확인 할 수 있다.

## GET movie_search/_mapping
{
  "movie_search": {
    "mappings": {
        "_doc": {
              "properties": {
                "movieCode": {
                      "type": "keyword"
                },
                "movieName": {
                      "type": "text",
                      "analyzer": "standard"
                },
              }
        }
      }
  }
}

매핑 파라미터

  • analyzer
    • 형태 분석소 지정. text 타입은 analyzer를 사용해야한다, 미지정시 standard analyzer 로 자동 설정된다.
  • normalizer
    • term query 에 분석기 사용하기 위함. keyword 타입 경우 원문 기준 색인되기 때문에 대소문자 구별되는등 다른 문서로 인식되지만, normalizer를 통해서 asciifolding 이나 lowercase 같은 필터를 사용함으로 같은 데이터로 인식 할 수 있게 한다.
  • boost
    • 필드에 가중치를 부여한다. 가중치에 따라서 score가 달라져서 노출 순서에 영향을 주기 때문에 주의해야 한다. 루씬 7.0부터는 boost 설정이 불가능하다.
  • coerce
    • 색인 시 자동 변환 허용 여부 지정 파라미터. 10 같은 숫자 형태 문자열이 integer 타입으로 설정된 필드로 들어 왔을때 자동으로 형변환을 수행할지 설정한다.
  • copy_to
    • 지정한 필드로 복사를 할 수 있다. 예를 들어서 keyword 타입으로 들어온 데이터를 text 타입 필드로 복사해서 keyword 타입을 그대로 둔 상태로 형태소 분석 할 수도 있다.
  • fielddata
    • 힙 공간에 생성되는 메모리 캐시. 현재는 dov_values라는 디스크 기반 신규 캐시를 제공해서 대부분 경우 사용되지 않는다. 다만, text 필드를 집계 또는 정렬 기능을 수행하기 위해서는 부득이하게 fielddata를 사용하지만 최소한으로 사용해야 한다. (doc_values는 text 필드를 지원하지 않는다.)
  • doc_values
    • 기본 캐시. text 타입 제외한 모든 타입에서 사용한다. 디스크 기반 캐시이고, 파일 시스템 캐시를 통해서 GC 비용이 들지 않으면서도 메모리 연산과 비슷한 성능을 보여준다. (이게 가능한 부분인가??)
  • dynamic
    • 동적 필드 처리 방식. 아래 3가지로 설정 할 수 있다.
      • true: 신규 필드를 매핑에 추가.
      • false: 신규 필드 무시. 검색은 되지 않지만 _source 에는 표시된다.
      • strict: 신규 필드 감지시 예외 발생.
  • enabled
    • 색인 여부 설정. false 로 설정시 색인되지는 않지만 _source 에는 표시된다.
  • format
    • 엘라스틱서치는 datetime을 문자열로 표시한다. 이때 미리 구성된 포맷을 사용 할 수 있다.
      • basic_date: yyyyMMdd
      • basic_date_time: yyyyMMdd'T'HHmmss.SSS
      • 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
    • 기본적으로 엘라스틱서치에서는 잘못된 데이터 타입 색인시 예외가 발생하지만, ignore_malformed 설정시 해당 필드만 무시하고 색인된다.
  • index
    • 색인할지 결정한다. 기본값은 true 이다.
  • fields
    • 다중 필드 설정 옵션.
  • norms
    • 문서 score 값 계산에 필요한 정규화 인수 사용 여부 설정. score 계산이 필요 없는 경우 비활성화로 디스크 공간을 절약 할 수 있다.
  • null_value
    • 기본적으로 null 인 경우 필드를 생성하지 않는다. 이 값을 설정하면 null 로 생성하고 해당 값으로 저장한다.
  • position_increment_gap
    • 배열 형태 색인시 검색 정확도를 높이기 위한 옵션. ["Lebron James", "Michle Jordan"] 데이터가 있을 경우 Michle James 로 검색이 가능할지 여부를 선택한다.
  • properties
    • Object 타입이나 Nested 타입 스키마 정의시 사용되는 옵션.
  • search_analyzer
    • 일반적으로 색인 검색은 같은 분석기를 사용한다. 검색시 다른 분석기를 사용하고 싶은 경우 지정할수 있다.
  • similarity
    • 유사도 측정 알고리즘 지정. 기본적으로는 BM25 알고리즘이다. (기타 알고리즘: classic, boolean)
  • store
    • 필드를 자체 저장하기 위한 옵션. RDBMS 에서 인덱스 설정과 비슷한 개념으로 이해함.
  • term_vector
    • 루씬에서 분석된 용어 정보 포함 여부 설정.

메타 필드

  • 생성된 문서에서 제공하는 특별한 필드
  • _index
    • 해당 문서가 속한 인덱스 정보
  • _type
    • 해당 문서 매핑 타입 정보
  • _id
    • 문서 식별 유니크 키 값
  • _source
    • 문서의 원본 데이터 제공
  • _all
    • 색인에 사용된 모든 필드 정보
  • _routing
    • 특정 문서를 특정 샤드에 저장하기 위한 정보. 별도 설정 없으면 id에 따라서 샤드에 골고루 분산 저장

필드 데이터 타입

  • keyword
    • 분석기 거치지 않고 원문 그대로 색인
    • 주요 사용 항목
      • 검색 시 필터링되는 항목
      • 정렬이 필요한 항목
      • 집계해야 하는 항목
  • text
    • 분석기로 데이터를 분석하기 원하는 경우
    • 정렬 또는 집계가 필요한 경우 text 및 keyword 타입을 동시에 가지게 한다.
  • array
    • 여러개 데이터 타입을 입력하고 싶은 경우 사용
    • array 에 저장되는 타입은 같은 타입이여야 한다.
  • numeric
    • long
    • integer
    • short
    • byte
    • double
    • float
    • half_float
  • date
    • 날짜 시간 데이터
    • 기본적으로 date_time/strict_date_time 포맷 사용
    • 내부적으로 UTC 밀리초 단위로 저장
  • range
    • 범위 데이터
    • number, date, ip 제공
      • integer_range
      • float_range
      • long_range
      • double_range
      • date_range
  • boolean
    • true
    • false
  • geo-point
    • 위도, 경도 등 위치 정보 데이터
    • 반경내 쿼리, 위치 기반 집계, 위치별 정렬등 기능 사용 가능
  • ip
    • IP 주소 데이터
    • IPv4 IPv6 가능
  • object
    • 내부 객체를 계층 포함하기 위한 타입.
  • nested
    • Object 타입과 비슷하지만, 객체 배열을 독립적으로 색인하고 질의 가능 타입