시뻘건 개발 도전기

데이터 모델링: 데이터 타입 본문

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

데이터 모델링: 데이터 타입

시뻘건볼때기 2023. 12. 9. 00:42
반응형

필드에는 다음과 같은 데이터 타입을 지정할 수 있다.

- keyword, text 같은 문자열 데이터 타입
- date, long, double, integer, boolean, ip 같은 일반적인 데이터 타입
- 객체 또는 중첩문과 같은 JSON 계층의 특성의 데이터 타입
- geo_point, geo_shape 같은 특수한 데이터 타입

 

Keyword 타입

별도의 분석기를 거치지 않고 원문 그대로 색인되기 때문에 특정 코드나 키워드 등 정형화된 콘텐츠에 주로 사용된다. 엘라스틱서치의 일부 기능은 형태소 분석을 하지 않아야만 사용이 가능한데 이 경우에도 Keyword 타입이 사용된다.

PUT movie_search_datatype/_mapping/_doc
{
	"properties": {
		"multiMovieYn": {
			"type": "keyword"
		}
	}
}

 

Keyword 타입은 아래에 해당하는 항목에 많이 사용된다.

  • 검색 시 필터링 되는 항목
  • 정렬이 필요한 항목
  • 집계해야하는 항목

이 세가지의 경우에는 반드시 Keyword 타입을 사용해야한다. 만약 'elastic search'라는 문자열이 keyword타입으로 설정되면 'elastic'이나 'search'라는 질의로는 절대 검색되지 않는다. Keyword 타입에서 설정이 가능한 주요 파라미터는 아래와 같다.

boost 필드의 가중치로, 검색 결과 정렬에 영향을 준다. 기본값은 1.0이며 1보다 크면 점수(score)가 높게 오르고, 적으면 점수가 낮게 오른다. 이를 이용해 검색에 사용된 키워드와 문서 간의 유사도 스코어 값을 계산할 때 필드의 가중치 값을 얼마나 더 줄 것인지를 판단한다.
doc_values 필드를 메모리에 로드해 캐시로 사용한다. 기본값은 true다.
index 해당 필드를 검색에 사용할지를 설정한다. 기본값은 true다.
null_value 기본적으로 엘라스틱서치는 데이터의 값이 없으면 필드를 생성하지 않는다. 데이터의 값이 없는 경우 null로 필드의 값을 대체할지를 설정한다.
store 필드 값을 필드와 별도로_source에 저장하고 검색 가능하게 할지를 설정한다. 기본값은 false다.

 

Text 타입

색인 시 지정된 분석기가 칼럼의 데이터를 문자열 데이터로 인식하고 이를 분석한다. 만약 별도의 분석기를 정의하지 않으면 Standard Analyzer를 사용한다. 문장 형태의 데이터에 사용하기 적합하다. 전문 검색이 가능하다는 점에서 전체 텍스트가 토큰화되어 생성되며 특정 단어를 검색하는 것이 가능해진다. 필드에 검색뿐 아니라 정렬이나 집계연산을 사용해야할 때가 있을텐데 그런 경우에는 Text와 Keyword 타입을 동시에 갖도록 멀티 필드로 설정할 수도 있다.

PUT movie_search/_mapping/_doc
{
	"properties": {
		"movieComment": {
			"type":"text",
			"fields": {
				"movieComment_keyword" : {
					"type": "keyword"
				}
			}
		}
	}
}

Text 타입에서 설정 가능한 주요 파라미터는 아래와 같다.

analyzer 인덱스와 검색에 사용할 형태소 분석기를 선택한다. 기본값은 Standard Analyzer다.
boost 필드의 가중치로, 검색 결과 정렬에 영향을 준다. 기본값은 1.0으로 1보다 크면 점수가 높게 오르고, 적으 면 점수가 낮게 오른다.
fielddata 정렬, 집계, 스크립트 등에서 메모리에 저장된 필드 데이터를 사용할지를 설정한다. 기본값은 false다.
index 해당 필드를 검색에 사용할지를 설정한다. 기본값은 true다.
norms 유사도 점수를 산정할 때 필드 길이를 고려할지를 결정한다. 기본값은 true다.
store 필드 값을 필드와 별도로_source에 저장하고 검색 가능하게 할지를 설정한다. 기본값은 false다.
search_analyzer  검색에 사용할 형태소 분석기를 선택한다.
similarity 유사도 점수를 구하는 알고리즘을 선택한다. 기본값은 BM25다.
term_vector Analyzed 필드에 텀벡터를 저장할지를 결정한다. 기본값은 no다.

 

Array 타입

여러 개의 데이터를 입력하고 싶은 경우 사용한다. 문자열이나 숫자처럼 일반적인 값을 지정할 수도 있지만 객체 형태로도 정의할 수 있다. 한 가지 주의할 점은 Array 타입에 저장되는 값은 모두 같은 타입으로만 구성되어야 한다는 점이다. 엘라스틱서치에서는 맵핑 설정시 Array 타입을 명시적으로 정의하지 않는다. 정의된 인덱스 필드에 단순히 배열 값을 입력하면 자동으로 Array 타입으로 저장된다.

 

Numeric 타입

엘라스틱서치에서 숫자 타입은 여러 종류가 제공된다. 숫자 데이터 타입이 여러 개 제공되는 이유는 데이터의 크기에 알맞은 타입을 제공함으로써 색인과 검색을 효율적으로 처리하기 위해서다.

long 최솟값과 최댓값을 가지는 부호있는 64비트 정수 범위는 [-2³~2³-1]
integer 최솟값과 최댓값을 가지는 부호있는 32비트 정수 범위는 [-2³¹~2³¹-1]
short 최솟값과 최댓값을 가지는 부호 있는 16비트 정수. 범위는 [-32,768~32,767]
byte 최솟값과 최댓값을 가지는 부호 있는 8비트 정수 범위는 [-128~127]
double 64비트 부동 소수점을 갖는 수
float 32비트 부동 소수점을 갖는 수
half_float 16비트 부동 소수점을 갖는 수

 

Date 타입

Date 타입은 json 포맷에서 문자열로 처리된다. 날짜는 다양하게 표현될 수 있기때문에 형식을 명시적으로 설정해야한다. 날짜 형식에 대해서는 지난번 데이터 모델링: 맵핑 api 포스팅을 참고하면 좋다. 날짜 형식의 기본 값은 "yyyy-MM-ddTHH:mm:ssZ"로 설정된다.

 

Range 타입

범위가 있는 데이터를 저장할 때 사용한다. 숫자 뿐 아니라 IP에 대한 범위도 Range 타입으로 정의할 수 있다.

integer_range 최솟값과 최댓값을 갖는 부호 있는 32비트 정수 범위
float_range 부동 소수점 값을 갖는 32비트 실수 범위
long_range 최솟값과 최댓값을 갖는 부호 있는 64비트 정수의 범위
double_range 부동 소수점 값을 갖는 64비트 실수 범위
date_range 64비트 정수 형태의 밀리초로 표시되는 날짜값의 범위
ip_range IPv4, IPv6 주소를 지원하는 IP 값

 

Boolean 타입

참/거짓 두 논리값을 가지는 타입이다. 참과 거짓 값을 "true", "false"처럼 문자열로 표현하는 것도 가능하다.

 

Geo-Point 타입

위도, 경도 등 위치 정보를 가지는 타입이기 때문에 위치 기반 데이터를 색인하고 검색할 때 유용하다.

 

IP 타입

IP주소 데이터를 가지는 타입이다. IPv4와 IPv6 모두 지정할 수 있다.

 

Object 타입

json 포맷의 문서는 내부 객체를 계층적으로 포함할 수 있다. 문서의 필드는 단순히 값을 가질 수도 있지만 복잡한 형태의 또 다른 문서를 포함하는 것도 가능하다. 이처럼 값으로 문서를 가지는 필드의 데이터 타입을 Object 타입이라고 한다. Object 타입을 정의할 때는 다른 데이터 타입과 같이 특정 키워드를 이용하지 않는다. 단지 필드 값으로 다른 문서의  구조를 입력하면 된다.

 

Nested 타입

Object 객체 배열을 독립적으로 색인하고 질의하는 형태의 타입이다. 데이터가 배열 형태로 저장되면 한 필드 내의 검색은 OR 조건으로 검색된다. 이 문제점을 해결하기 위해 검색할 때 일치하는 문서만 정확하게 출력해주는 것이 Nested 타입이다.

 

 

반응형
Comments