[Elastic Search] 데이터 모델링

데이터 모델링

인덱스내의 필드 속성을 통해 문서를 색인시킬 수 있다. 엘라스틱 서치는 기본적으로 스키마리스이기 때문에 주의해서 사용해야 한다.

7.x 이상 버전부터 인덱스에는 하나의 타입만 가능하기 때문에 타입을 언급하지 않아도 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
PUT movie_search
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"movieCd": {
"type": "keyword"
},
"movieNm": {
"type": "text",
"analyzer": "standard"
},
.....
},
"companies": {
"properties": {
"companyCd": {
"type": "keyword"
},
"companyNm": {
"type": "keyword"
}
}
},
"directors": {
"properties": {
"peopleNm": {
"type": "keyword"
}
}
}
}
}
}

이렇게 매핑된 정보는 GET movie_search/_mapping을 통해 확인 가능하다.

매핑 파라미터

색인할 필드의 데이터를 어떻게 저장할지에 대해 매핑 파라미터를 통해 설정할 수 있다.

  • analyzer : 해당 필드의 데이터를 형태소 분석 한다.
  • normalizer : 해당 필드의 데이터를 정규화해서 분석 한다.
    • 예를 들어 cafe, Cafe, Café를 같은 데이터로 인식시킨다.
  • boost : 필드에 가중치를 부여한다. 색인시점에 boost 부여시 재색인 전에는 가중치 변경이 불가능해진다. 7.0 이상에선 색인시 가중치 부여가 불가능하도록 변경됨
  • coerce : 색인시 자동 형변환 여부를 설정한다. integer 타입 필드에 "10"이 들어온다면 10으로 변환한다.
  • copy_to : 해당 파라미터가 추가된 필드는 지정한 다른 필드로 값이 추가될 때 복사한다. 따라서 서로 다른 타입으로 지정해 분석을 할 수 있다.
  • fielddata : 엘라스틱서치가 힙에 생성하는 메모리 캐시기능이다. 메모리문제와 GC로 인해 기본적으로 false이다. text 타입에 집계 api를 사용해야 할 경우 시도해볼 수 있다.
  • doc_values : 엘라스틱서치가 기본으로 사용하는 캐시이다. text 타입을 제외한 모든 타입에서 사용한다. OS의 파일 시스템 캐시를 통해 사용되기 때문에 GC 비용에 대한 부담이 없다.
  • dynamic : 동적으로 매핑에 필드를 추가할지에 대한 여부를 설정한다.
  • enabled : 검색결과에는 포함하지만 색인은 하고싶지 않은 필드에 설정한다.
  • format : 날짜 / 시간 데이터에 대한 포멧을 결정할 수 있다.
  • ignore_above : 필드에 저장되는 값이 지정한 크기를 넘으면 빈 값으로 저장한다.
  • ignore_malformed : 잘못된 데이터 타입을 색인하려했을때 예외를 발생시키지 않고 필드를 무시시키고 문서를 색인시킨다.
  • index : 필드값을 색인할지를 결정한다.
  • fields : 다중 필드 설정 옵션이다. 서로 다른 분석기로 처리하거나 하는 용도로 사용할 수 있다.
  • norms : 문서의 _score 계산에 정규화 인수를 사용할지에 대한 여부이다.
  • null_value : 문서에 필드가 없거나 null일 시 기본적으로 필드를 생성하지 않으나 null_value를 통해 기본값 지정을 할 수 있다.
  • position_increment_gap : 배열 형태의 데이터를 색인할 때 정확도를 높히는 옵션이다.
  • properties : 오브젝트 타입이나 중첩 타입 스키마를 정의할 때 사용한다.
  • search_analyzer : 검색시 사용할 분석기를 별도 지정할 수 있다.
  • similarity : 유사도 측정 알고리즘을 지정한다. 기본적으로 BM25이다.
  • store : 필드 값을 저장해 검색 결과에 포함시키기 위한 파라미터다.
  • term_vector : 루씬에서 분석된 용어 정보를 포함할지에 대한 옵션이다.

메타 필드

_index

문서가 속한 인덱스의 정보를 담는다.

_type

해당 문서가 속한 매핑의 타입 정보를 담는다.

_id

문서를 식별하는 유일한 키이다.

_source

문서의 원본 데이터를 제공하는 필드이다.

_routing

문서를 특정 샤드에 저장하기 위해 지정하는 필드이다. 기본적으로 document_id의 값을 해싱해서 사용하나, _routing 값이 존재하면 이 값으로 해싱해서 샤드를 지정한다.

필드 데이터 타입

keyword

키워드 형태로 사용할 데이터에 적합한 타입이다. 원문 그대로 색인된다. 검색시 필터링이나 정렬 집계가 필요한 항목에 대해서 사용한다.

text

텍스트 타입은 색인 시 지정한 분석기가 칼럼 데이터를 분석한다. 이를 통해 전문 검색을 가능하게 할 수 있다. 다만 집계나 정렬이 불가능해진다. 필요하다면 copy_to를 통해 멀티필드로 설정할 수 있다.

array

엘라스틱서치는 필드가 다수의 값을 가질 수 있기 때문에 별도로 지정하는 타입은 아니지만 배열값을 저장하면 array 형태로 저장된다.

numeric

숫자 타입의 데이터를 저장할 때 사용된다.

date

날짜 타입의 정보는 JSON 에서 문자열로 처리되기 때문에 필요하다면 포멧터를 설정해야 한다. 기본 형식은 yyyy-MM-ddTHH:mm:ssZ이다.

range

범위 있는 데이터를 저장할 때 사용한다. 범위의 시작 값과 마지막 값을 정의하면 된다.

object

필드값으로 문서를 가지는 타입을 object 타입이라고 한다.

nested

object 타입 배열을 독립적으로 색인하고 질의하는 형태의 데이터 타입이다. 데이터가 배열형태로 저장되면 OR조건으로 수행되는데, 이를 보완하기 위해 만들어진 타입이다.

그외..

boolean, ip, geo-point가 있다.

루씬의 역색인 구조

루씬은 데이터를 검색하기 위해 역색인이라는 방식을 통해 구조화해 검색한다. 역색인 구조는 다음과 같다.

  1. 모든 문서가 가지는 단어의 고유 단어 목록
  2. 해당 단어가 어떤 문서에 속한지에 대한 정보
  3. 전체 문서에 각 단어가 몇개씩 들어있는지에 대한 정보
  4. 하나의 문서에 단어가 몇번씩 출현하는지에 대한 정보
Author: Song Hayoung
Link: https://songhayoung.github.io/2021/07/12/Elastic%20Search/chapter3/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.