Keyword 필드 타입
Keyword 필드 타입
keyword 필드 타입은 분석되지 않은 문자열을 담아요. 정확하고 대소문자를 구분하는 일치만 허용해요.
기본적으로 keyword 필드는 (index가 활성화되어) 색인되고 (doc_values가 활성화되어) 디스크에 저장돼요. 디스크 공간을 줄이려면 index를 false로 설정해 keyword 필드를 색인하지 않도록 지정할 수 있어요.
필드를 전체 텍스트 검색에 사용해야 한다면 대신 text로 매핑하세요.
출처: 문서
본문
예시
다음 쿼리는 keyword 필드가 있는 매핑을 만들어요. index를 false로 설정하면 genre 필드를 디스크에 저장하고 doc_values로 검색할 수 있게 지정해요.
PUT movies
{
"mappings" : {
"properties" : {
"genre" : {
"type" : "keyword",
"index" : false
}
}
}
}
파라미터 (Parameters)
keyword 필드 타입이 받는 파라미터는 다음 표와 같아요. 모든 파라미터는 선택 사항이에요.
| 파라미터 | 설명 | 기본값 | 동적 업데이트 |
|---|---|---|---|
boost |
관련성 점수에 대한 이 필드의 가중치를 지정하는 부동소수점 값이에요. 1.0보다 큰 값은 필드의 관련성을 높이고, 0.0과 1.0 사이의 값은 관련성을 낮춰요. | 1.0 | 예 |
doc_values |
집계, 정렬, 스크립팅에 사용할 수 있도록 필드를 디스크에 저장할지 여부를 지정하는 불리언 값이에요. | true | 아니요 |
eager_global_ordinals |
refresh 시 global ordinals를 미리 로드할지 여부를 지정해요. 필드가 집계에 자주 사용된다면 이 파라미터를 true로 설정해야 해요. |
false | 예 |
fields |
같은 문자열을 여러 방식으로 색인하려면(예: keyword와 text로 모두) fields 파라미터를 제공해요. 검색에 사용할 필드 버전과 정렬·집계에 사용할 필드 버전을 각각 지정할 수 있어요. |
None | 아니요 |
ignore_above |
이 정수 값보다 긴 문자열은 색인하지 않아요. 기본 동적 매핑은 ignore_above가 256으로 설정된 keyword 하위 필드를 만들어요. |
2147483647 | 예 |
index |
필드를 검색 가능하게 할지 여부를 지정하는 불리언 값이에요. 디스크 공간을 줄이려면 index를 false로 설정하세요. |
true | 아니요 |
index_options |
관련성 점수 계산 시 고려할 인덱스에 저장할 정보예요. 용어 빈도를 위해 freqs로 설정할 수 있어요. |
docs | 아니요 |
meta |
이 필드에 대한 메타데이터를 받아요. | None | 예 |
normalizer |
색인 전에 이 필드를 전처리하는 방법을 지정해요(예: 소문자로 만들기). | null (전처리 없음) | 아니요 |
norms |
관련성 점수 계산 시 필드 길이를 사용할지 여부를 지정하는 불리언 값이에요. | false | 예 |
null_value |
null 대신 사용할 값이에요. 필드와 같은 타입이어야 해요. 이 파라미터를 지정하지 않으면 값이 null일 때 필드가 없는 것으로 처리돼요. |
null | 아니요 |
similarity |
관련성 점수를 계산하는 랭킹 알고리즘이에요. | 인덱스의 similarity 설정(기본값 BM25) | 아니요 |
use_similarity |
관련성 점수를 계산할지 여부를 결정해요. 기본값은 false이며, 더 빠른 쿼리를 위해 constant_score를 사용해요. 이 파라미터를 true로 설정하면 스코어링을 활성화하지만 검색 지연 시간이 늘어날 수 있어요. use_similarity 파라미터 문서를 참고하세요. |
false | 예 |
split_queries_on_whitespace |
전체 텍스트 쿼리를 공백 기준으로 분할할지 여부를 지정하는 불리언 값이에요. | false | 예 |
store |
필드 값을 저장하고 _source 필드와 별도로 검색할 수 있게 할지 여부를 지정하는 불리언 값이에요. |
false | 아니요 |
use_similarity 파라미터
use_similarity 파라미터는 keyword 필드를 쿼리할 때 OpenSearch가 관련성 점수를 계산할지 제어해요. 기본값은 false이며, constant_score를 사용해 성능을 향상시켜요. true로 설정하면 구성된 similarity 알고리즘(일반적으로 BM25)에 따라 스코어링을 활성화하지만 쿼리 지연 시간이 늘어날 수 있어요.
use_similarity가 비활성화된(기본값) 인덱스에서 term 쿼리를 실행해 볼게요.
GET /big5/_search
{
"size": 3,
"explain": false,
"query": {
"term": {
"process.name": "kernel"
}
},
"_source": false
}
쿼리는 빠르게(10 ms) 결과를 반환하고, 모든 문서는 1.0의 일정한 관련성 점수를 받아요.
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 10000,
"relation": "gte"
},
"max_score": 1,
"hits": [
{
"_index": "big5",
"_id": "xDoCtJQBE3c7bAfikzbk",
"_score": 1
},
{
"_index": "big5",
"_id": "xzoCtJQBE3c7bAfikzbk",
"_score": 1
},
{
"_index": "big5",
"_id": "yDoCtJQBE3c7bAfikzbk",
"_score": 1
}
]
}
}
process.name 필드에 대해 기본 BM25 알고리즘으로 스코어링을 활성화하려면 인덱스 매핑에 use_similarity 파라미터를 제공해요.
PUT /big5/_mapping
{
"properties": {
"process.name": {
"type": "keyword",
"use_similarity": true
}
}
}
구성된 인덱스에서 같은 term 쿼리를 실행하면 쿼리 실행에 더 오래 걸리고(200 ms), 반환된 문서들은 용어 빈도와 기타 BM25 요소에 따라 서로 다른 관련성 점수를 가져요.
{
"took" : 200,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 10000,
"relation" : "gte"
},
"max_score" : 0.8844931,
"hits" : [
{
"_index" : "big5",
"_id" : "xDoCtJQBE3c7bAfikzbk",
"_score" : 0.8844931
},
{
"_index" : "big5",
"_id" : "xzoCtJQBE3c7bAfikzbk",
"_score" : 0.8844931
},
{
"_index" : "big5",
"_id" : "yDoCtJQBE3c7bAfikzbk",
"_score" : 0.8844931
}
]
}
}
파생 소스 (Derived source)
인덱스가 derived source를 사용하면, OpenSearch는 소스 재구성 중에 다중 값 keyword 필드의 keyword 값을 정렬하고 중복을 제거할 수 있어요.
derived source를 활성화하고 name 필드를 구성한 인덱스를 만들어 볼게요.
PUT sample-index1
{
"settings": {
"index": {
"derived_source": {
"enabled": true
}
}
},
"mappings": {
"properties": {
"name": {
"type": "keyword"
}
}
}
}
중복을 포함한 여러 keyword 값이 있는 문서를 인덱스에 색인해 볼게요.
PUT sample-index1/_doc/1
{
"name": ["ba", "ab", "ac", "ba"]
}
OpenSearch가 _source를 재구성한 뒤의 파생 _source는 중복을 제거하고 값을 알파벳 순으로 정렬해요.
{
"name": ["ab", "ac", "ba"]
}
필드 매핑이 null_value를 정의하면, 재구성 중에 수집된 null 값은 그 값으로 대체돼요. 다음 예시는 null_value가 파생 소스 출력에 어떤 영향을 주는지 보여줘요.
derived source를 활성화하고 name 필드의 null_value를 구성한 인덱스를 만들어 볼게요.
PUT sample-index2
{
"settings": {
"index": {
"derived_source": {
"enabled": true
}
}
},
"mappings": {
"properties": {
"name": {
"type": "keyword",
"null_value": "foo"
}
}
}
}
null 값이 있는 문서를 인덱스에 색인해 볼게요.
PUT sample-index2/_doc/1
{
"name": [null, "ba", "ab"]
}
OpenSearch가 _source를 재구성한 뒤의 파생 _source는 null 값을 대체하고 값을 알파벳 순으로 정렬해요.
{
"name": ["ab", "ba", "foo"]
}