개요
엘라스틱서치에서는 색인 할때 문서의 데이터 유형에 따라 필드에 적절한 데이터 타입을 지정해야 한다. 이 과정을 매핑이라고 하며, 이는 데이터 모델링이라 할 수 있다. 매핑은 데이터베이스의 스키마에 대응하는 개념이라고 할수 있다(데이터 타입을 구체적으로 정의하는 일)
매핑 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: 신규 필드 감지시 예외 발생.
- 동적 필드 처리 방식. 아래 3가지로 설정 할 수 있다.
- 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
- 엘라스틱서치는 datetime을 문자열로 표시한다. 이때 미리 구성된 포맷을 사용 할 수 있다.
- 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 타입과 비슷하지만, 객체 배열을 독립적으로 색인하고 질의 가능 타입
'언어 > Java' 카테고리의 다른 글
ElasticSearch 스터디 정리 (6) - 데이터 집계 2 (2) | 2020.01.16 |
---|---|
ElasticSearch 스터디 정리 (4) - Query DSL 1 (0) | 2019.12.19 |
ElasticSearch 스터디 정리 (3) - 엘라스틱서치 분석기 (2) | 2019.12.12 |
ElasticSearch 스터디 정리 (1) (0) | 2019.11.27 |
Java 경력 기술 면접 준비(1) (0) | 2019.08.25 |