지원 필드 타입

지원 필드 타입 (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 값을 포함해요.

더 알아보기 (Learn more)