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"]
}

더 알아보기 (Learn more)