지원 필드 타입
지원 필드 타입 (Supported field types)
매핑을 만들 때 필드에 데이터 타입을 지정할 수 있어요. 다음 섹션들은 목적이나 데이터 구조에 따라 지원되는 필드 타입을 그룹으로 나눠 소개해요.
출처: 문서
본문
핵심 필드 타입 (Core field types)
| 필드 타입 | 설명 |
|---|---|
alias |
기존 필드의 다른 이름이에요. |
boolean |
참/거짓(true/false) 값이에요. |
binary |
Base64 인코딩된 이진 값이에요. |
문자열 기반 필드 타입 (String-based field types)
| 필드 타입 | 설명 |
|---|---|
text |
분석된 전체 텍스트 문자열이에요. |
match_only_text |
검색 전용 사례를 위한 text의 경량 버전이에요. |
keyword |
분석되지 않은 문자열로, 정확히 일치하는 검색에 유용해요. |
constant_keyword |
인덱스의 모든 문서에 동일한 값을 사용해요. |
icu_collation_keyword |
collation 규칙으로 정렬하기 위한 언어별 keyword예요. |
wildcard |
효율적인 부분 문자열과 정규식 매칭을 가능하게 해요. |
token_count |
분석 후 토큰 수를 저장해요. |
version |
시맨틱 버저닝 규격을 따르는 시맨틱 버전 문자열이에요. |
숫자 필드 타입 (Numeric field types)
| 필드 타입 | 설명 |
|---|---|
byte |
부호 있는 8비트 정수예요. 최솟값은 −128, 최댓값은 127이에요. |
short |
부호 있는 16비트 정수예요. 최솟값은 −2¹⁵, 최댓값은 2¹⁵ − 1이에요. |
integer |
부호 있는 32비트 정수예요. 최솟값은 −2³¹, 최댓값은 2³¹ − 1이에요. |
long |
부호 있는 64비트 정수예요. 최솟값은 −2⁶³, 최댓값은 2⁶³ − 1이에요. |
unsigned_long |
부호 없는 64비트 정수예요. 최솟값은 0, 최댓값은 2⁶⁴ − 1이에요. |
half_float |
반정밀도 16비트 IEEE 754 부동소수점 값이에요. 최대 크기는 65504예요. |
float |
단정밀도 32비트 IEEE 754 부동소수점 값이에요. |
double |
배정밀도 64비트 IEEE 754 부동소수점 값이에요. |
scaled_float |
double 스케일 인자만큼 곱해져 long 값으로 저장되는 부동소수점 값이에요. |
날짜 및 시간 필드 타입 (Date and time field types)
| 필드 타입 | 설명 |
|---|---|
date |
밀리초 단위로 저장된 날짜 또는 타임스탬프예요. |
date_nanos |
나노초 단위로 저장된 날짜 또는 타임스탬프예요. |
IP 필드 타입 (IP field types)
| 필드 타입 | 설명 |
|---|---|
ip |
IPv4 또는 IPv6 주소를 저장해요. |
Geographic 필드 타입
| 필드 타입 | 설명 |
|---|---|
geo_point |
위도와 경도로 지정된 지리적 점이에요. |
geo_shape |
폴리곤이나 지리적 점들의 모임 같은 지리적 모양이에요. |
Cartesian 필드 타입
| 필드 타입 | 설명 |
|---|---|
xy_point |
2차원 데카르트 좌표계의 점이에요. |
xy_shape |
2차원 데카르트 좌표계의 모양이에요. |
범위 필드 타입 (Range field types)
| 필드 타입 | 설명 |
|---|---|
integer_range |
정수 값의 범위예요. |
long_range |
long 값의 범위예요. |
double_range |
double 값의 범위예요. |
float_range |
float 값의 범위예요. |
ip_range |
IPv4 또는 IPv6 형식의 IP 주소 범위예요. |
date_range |
날짜 값의 범위예요. |
객체 필드 타입 (Object field types)
| 필드 타입 | 설명 |
|---|---|
object |
JSON 객체예요. |
nested |
별도의 문서로 색인되는 JSON 객체 배열이에요. |
flat_object |
문자열의 평면 맵으로 처리되는 JSON 객체예요. |
join |
문서 간의 부모/자식 관계를 정의해요. |
자동 완성 필드 타입 (Autocomplete field types)
| 필드 타입 | 설명 |
|---|---|
completion |
suggester를 사용한 자동 완성 기능을 지원해요. |
search_as_you_type |
접두사 및 삽입형 search-as-you-type 쿼리를 가능하게 해요. |
벡터 필드 타입 (Vector field types)
| 필드 타입 | 설명 |
|---|---|
knn_vector |
k-NN 검색과 벡터 유사도 연산을 위해 밀집 벡터를 색인해요. |
sparse_vector |
신경망 희소 ANN 검색을 위해 희소 벡터를 색인해요. |
특수 검색 필드 타입 (Specialized search field types)
| 필드 타입 | 설명 |
|---|---|
semantic |
시맨틱 검색 설정을 단순화하기 위해 text 또는 binary 필드를 감싸요. |
rank_feature |
문서의 관련성 점수를 높이거나 낮춰요. |
rank_features |
문서의 관련성 점수를 높이거나 낮춰요. 특징 목록이 희소할 때 사용해요. |
percolator |
역방향 검색 연산을 위한 저장된 쿼리 역할을 하는 필드예요. |
star_tree |
star-tree 인덱스를 사용해 더 빠른 성능을 위해 집계를 사전 계산해요. |
derived |
스크립트를 사용해 다른 필드에서 계산되는 동적 생성 필드예요. |
배열 (Arrays)
OpenSearch에는 전용 배열 필드 타입이 없어요. 대신 어떤 필드에든 값 배열을 전달할 수 있어요. 배열의 모든 값은 동일한 필드 타입이어야 해요.
PUT testindex1/_doc/1
{
"number": 1
}
PUT testindex1/_doc/2
{
"number": [1, 2, 3]
}
semantic 필드는 임베딩 필드(rank_features 또는 knn_vector)로 매핑되어 단일 벡터만 지원하기 때문에 값 배열을 담을 수 없어요.
멀티 필드 (Multifields)
멀티 필드는 같은 필드를 다르게 색인하는 데 사용해요. 문자열은 전체 텍스트 쿼리용으로 text, 정확한 값 쿼리용으로 keyword로 매핑되는 경우가 흔해요.
멀티 필드는 fields 파라미터를 사용해 만들 수 있어요. 예를 들어 책 제목을 text 타입으로 매핑하면서 title.raw라는 keyword 타입의 하위 필드를 유지할 수 있어요.
PUT books
{
"mappings" : {
"properties" : {
"title" : {
"type" : "text",
"fields" : {
"raw" : {
"type" : "keyword"
}
}
}
}
}
}
null 값 (Null value)
필드의 값을 null, 빈 배열, 또는 null 값들의 배열로 설정하면 그 필드는 빈 필드와 동등해져요. 따라서 이 필드에 null이 있는 문서를 검색할 수는 없어요.
null 값에 대해 필드를 검색 가능하게 하려면 인덱스의 매핑에서 null_value 파라미터를 지정할 수 있어요. 그러면 이 필드에 전달되는 모든 null 값이 지정된 null_value로 대체돼요.
null_value 파라미터는 필드와 같은 타입이어야 해요. 예를 들어 필드가 문자열이면 해당 필드의 null_value도 문자열이어야 해요.
예시
emergency_phone 필드의 null 값을 "NONE" 문자열로 대체하는 매핑을 만들어 볼게요.
PUT testindex
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"emergency_phone": {
"type": "keyword",
"null_value": "NONE"
}
}
}
}
testindex에 세 개의 문서를 색인해 볼게요. 문서 1과 3의 emergency_phone 필드는 null을 포함하고, 문서 2의 emergency_phone 필드는 빈 배열을 가져요.
PUT testindex/_doc/1
{
"name": "Akua Mansa",
"emergency_phone": null
}
PUT testindex/_doc/2
{
"name": "Diego Ramirez",
"emergency_phone" : []
}
PUT testindex/_doc/3
{
"name": "Jane Doe",
"emergency_phone": [null, null]
}
응급 전화가 없는 사람을 검색해 볼게요.
GET testindex/_search
{
"query": {
"term": {
"emergency_phone": "NONE"
}
}
}
응답에는 문서 1과 3이 포함되지만 문서 2는 포함되지 않아요. "NONE" 문자열로 대체되는 것은 명시적인 null 값뿐이기 때문이에요.
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 0.18232156,
"hits" : [
{
"_index" : "testindex",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.18232156,
"_source" : {
"name" : "Akua Mansa",
"emergency_phone" : null
}
},
{
"_index" : "testindex",
"_type" : "_doc",
"_id" : "3",
"_score" : 0.18232156,
"_source" : {
"name" : "Jane Doe",
"emergency_phone" : [
null,
null
]
}
}
]
}
}
_source 필드는 null_value의 영향을 받지 않기 때문에 여전히 명시적인 null 값을 포함해요.