-
07. 데이터 타입(Data Type)BackEnd/elasticsearch 2021. 9. 20. 09:50반응형
1. Keyword 데이터 타입
키워드 형태로 사용할 데이터에 적합한 데이터 타입입니다. 별도의 분석기를 거치지 않고 원문 그대로 색인하기 때문에 특정 코드나 키워드 등 정형화된 콘텐츠에 주로 사용됩니다.
1) 검색 시 필터링되는 항목
2) 정렬이 필요한 항목
3) 집계해야 하는 항목
이 세 가지 경우에는 반드시 keyword 타입을 사용합니다.
PUT movie_search_datatype/_mapping/_doc { "properties": { "multiMovieYn": { "type": "keyword" } } }
(주요 파라미터) boost, doc_values, index, null_value, store
2. Text 데이터 타입
색인 시 지정된 분석기가 컬럼의 데이터를 문자열 데이터로 인식하고 이를 분석합니다. 제목이나 설명글과 같이 문장 형태의 데이터에 사용하기 적합한 데이터 타입입니다. 전문 검색이 가능하다는 가장 큰 특징이 있습니다.
검색뿐 아니라 정렬이나 집계 연산을 사용해야 할 때는 Text타입과 Keyword 타입을 동시에 갖도록 멀티 필드로 설정할 수 있습니다.
PUT movie_text/_mapping/_doc { "properties": { "moiveComment": { "type": "text", "fields": { "moiveComment_keyword" : { "type" : "keyword" } } } } }
(주요 파라미터) analyzer, boost, fielddata, index, norms, store, search_analyzer, similarity, term_vector
3. Array 데이터 타입
문자열이나 숫자처럼 일반적인 값을 지정할 수도 있지만 객체 형태로도 정의할 수 있습니다. 주의점은 Array 타입에 저장되는 값은 모두 같은 타입으로만 구성해야 한다는 점입니다.
- 문자열 배열: ["one", "two"]
- 정수 배열: [1, 2]
- 객체 배열: [{ "name": "Mary", "age": 12}, { "name": "John", "age": 10} ]
Array 타입의 경우 매핑 설정 시 명시적으로 정의하지 않습니다. 모든 필드가 기본적으로 다수의 값을 가질 수 있기 때문입니다. 정의된 인덱스 필드에 단순히 배열 값을 입력하면 자동으로 Array 형태로 저장됩니다. 만약 필드가 동적으로 추가된다면 배열의 첫 번째 값이 필드의 데이터 타입을 결정하며, 이후 데이터는 모두 같은 타입이어야 색인할 때 오류가 발생하지 않습니다.
PUT movie_search_datatype/_doc/1 { "title" : "해리포터와 마법사의 돌", "subtitleLang" : ["ko","en"] }
4. Numeric 데이터 타입
long 최솟값과 최댓값을 가지는 부호 있는 64비트 정수 integer 최솟값과 최댓값을 가지는 부호 있는 32비트 정수 short 최솟값과 최댓값을 가지는 부호 있는 16비트 정수 byte 최솟값과 최댓값을 가지는 부호 있는 8비트 정수 double 64비트 부동 소수점을 갖는 수 float 32비트 부동 소수점을 갖는 수 half_float 16비트 부동 소수점을 갖는 수 5. Date 데이터 타입
Date 타입은 JSON 포맷에서 문자열로 처리되며 올바르게 구문 분석될 수 있도록 날짜 문자열 형식을 명시적으로 설정해야 합니다. 기본 형식은 "yyyy-MM-ddTHH:mm:ssZ"로 지정됩니다.
- 문자열이 포함된 날짜 형식: "2021-09-20","2021/09.20","2021-09-20 09:15:00","2021/09/20 09:15:00"
- ISO_INSTANT 포맷의 날짜 형식: "2021-09-20T09:15:00Z"
- 밀리초: 1524449145579
어느 것을 사용해도 내부적으로 UTC의 밀리초 단위로 변환해 저장합니다.
PUT movie_text/_mapping/_doc { "properties": { "year": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" } } }
6. Range 데이터 타입
범위가 있는 데이터를 저장할 때 사용하는 데이터 타입입니다.
integer_range 최솟값과 최댓값을 갖는 부호 있는 32비트 정수 범위 float_range 부동 소수점 값을 갖는 32비트 실수 범위 long_range 최솟값과 최댓값을 갖는 부호 있는 64비트 정수 범위 double_range 부동 소수점 값을 갖는 64비트 실수 범위 date_range 64비트 정수 형태의 밀리초로 표시되는 날짜값의 범위 ip_range IPv4, IPv6 주소를 지원하는 IP 값 # 개봉일부터 종료일까지 표시하기 위한 date_range 타입 정의 PUT movie_search_datatype/_mapping/_doc { "properties": { "showRange": { "type": "date_range" } } } # 데이터 입력 시 시작값과 종료값의 범위를 지정 PUT movie_search_datatype/_doc/1 { "showRange": { "gte": "2001-01-01", "lte": "2001-12-31" } }
7. Boolean 데이터 타입
참과 거짓, 두 논리값을 가지는 데이터 타입입니다. (참: true, "true" / 거짓: false, "false")
8. Geo-Point 데이터 타입
위도, 경도 등 위치 정보를 담은 데이터를 저장할 때 사용합니다. 위치 기반 쿼리를 이용해 반경 내 쿼리, 위치 기반 집계, 위치별 정렬 등을 사용할 수 있기 때문에 위치 기반 데이터를 색인하고 검색하는 데 매우 유용합니다.
PUT movie_search_datatype/_mapping/_doc { "properties": { "filmLocation": { "type": "geo_point" } } } # 데이터 색인 시 위도와 경도값 직접 지정 PUT movie_search_datatype/_doc/1 { "title" : "해리포터와 마법사의 돌", "filmLocation": { "lat" : 55.4155828, "lon" : -1.7081091 } }
9. IP 데이터 타입
IP 주소와 같은 데이터를 저장하는 데 사용합니다. IPv4나 IPv6를 모두 지정할 수 있습니다.
10. Object 데이터 타입
JSON 포맷의 문서는 내부 객체를 계층적으로 포함할 수 있습니다. 문서의 필드는 단순히 값을 가질 수도 있지만 복잡한 형태의 또 다른 문서를 포함하는 것도 가능합니다. 이처럼 값으로 문서를 가지는 필드의 데이터 타입을 Object 데이터 타입이라고 합니다. Object 데이터 타입 정의는 특정 키워드를 이용하지 않고 단지 필드값으로 다른 문서의 구조를 입력하면 됩니다.
PUT movie_search_datatype/_mapping/_doc { "properties": { "companies": { "properties": { "companyName": { "type": "text" } } } } } # 문서의 계층 구조에 따라 데이터 입력 PUT movie_search_datatype/_doc/1 { "title": "해리포터와 마법사의 돌", "companies": { "companyName": "워너브라더스" } }
11. Nested 데이터 타입
Object 객체 배열을 독립적으로 색인하고 질의하는 형태의 데이터 타입입니다. 필드에 객체가 배열 형태로 저장되면 한 필드 내의 검색은 기본적으로 OR 조건으로 검색됩니다. 이런 문제를 해결하기 위해 nested 데이터 타입이 고안됐습니다.
# 인덱스 생성 PUT movie_search_datatype {} # Nested 데이터 타입 정의 PUT movie_search_datatype/_mapping/_doc { "properties": { "companies_nested": { "type": "nested" } } } # 데이터 색인 PUT movie_search_datatype/_doc/1 { "title": "해리포터와 마법사의 돌", "companies_nested": [ { "companyCd": "1", "companyName": "위너브라더스" }, { "companyCd": "2", "companyName": "Heyday Films" } ] } # 쿼리 실행 POST movie_search_datatype/_search { "query": { "nested": { "path": "companies_nested", "query": { "bool": { "must": [ { "match": { "companies_nested.companyName": "위너브라더스" } }, { "match": { "companies_nested.companyCd": "1" } } ] } } } } }
> 단순 배열 형태인 경우 companyName이 "위너브라더스"이고 companyCd가 "2"인 조건으로 검색됩니다. (OR 조건)
Nested 데이터 타입의 경우 companyName이 "위너브라더스"이고 companyCd가 "2"인 조건으로 검색되지 않습니다. 검색 시 일치하는 문서만 정확하게 출력할 수 있습니다.
반응형'BackEnd > elasticsearch' 카테고리의 다른 글
09. 문서관리 API(Document API) (0) 2021.09.24 08. 엘라스틱서치 분석기 (0) 2021.09.24 06. 메타 필드(Meta Fields) (0) 2021.09.19 05. 매핑 API (0) 2021.09.19 04. 용어 (0) 2021.09.19