Field data 매핑 파라미터
Field data 매핑 파라미터
기본적으로 text 필드는 정렬, 집계, 스크립팅에 사용할 수 없어요. fielddata 매핑 파라미터는 분석된 토큰을 힙 상주 데이터 구조에 로드해 text 필드를 정렬, 집계, 스크립팅에 사용할 수 있게 해줘요.
출처: 문서
본문
기본적으로 text 필드는 정렬, 집계, 스크립팅에 사용할 수 없습니다. 전체 텍스트 검색을 구동하는 역색인은 용어를 문서에 매핑하지만, 정렬과 집계에 필요한 문서별 필드 값은 제공하지 않습니다. text 필드에 집계나 정렬을 시도하면 keyword 필드를 대신 사용하라고 제안하는 오류가 반환됩니다.
fielddata 매핑 파라미터는 분석된 토큰을 힙 상주(heap-resident) 데이터 구조에 로드해 text 필드를 정렬, 집계, 스크립팅에 사용할 수 있게 만듭니다. OpenSearch는 필드가 이러한 연산 중 하나에 처음 접근될 때 이 구조를 요청 시(on demand) 구축합니다.
Field data는 분석된 토큰에서 동작하므로, text 필드를 집계하면 원래의 여러 단어 값(예: "Open Source")이 아니라 개별 용어(예: "open"과 "source")에 대한 버킷이 생성됩니다. 분석되지 않은 정확한 값으로 집계해야 한다면 대신 keyword 필드를 사용하세요.
Field data는 세그먼트 안의 모든 문서에 걸친 필드의 모든 고유 토큰을 로드하고 해당 세그먼트의 수명 동안 메모리에 유지되므로 상당한 양의 힙 메모리를 소비할 수 있습니다. 대부분의 경우 multi-fields에서 keyword 하위 필드를 사용하는 것이 field data를 활성화하는 것보다 더 나은 방법입니다.
예제
다음 예제는 text 필드에 fielddata를 활성화한 인덱스를 만듭니다.
PUT /fielddata_test
{
"mappings": {
"properties": {
"title": {
"type": "text",
"fielddata": true
}
}
}
}
몇 개의 문서를 인덱싱합니다.
POST /fielddata_test/_bulk?refresh=true
{"index":{}}
{"title":"OpenSearch performance tuning"}
{"index":{}}
{"title":"OpenSearch security configuration"}
{"index":{}}
{"title":"OpenSearch index management"}
fielddata가 활성화되어 있으므로 title 필드의 분석된 토큰에 집계할 수 있습니다.
GET /fielddata_test/_search
{
"size": 0,
"aggs": {
"top_terms": {
"terms": {
"field": "title",
"size": 5
}
}
}
}
응답은 개별 분석된 토큰(전체 필드 값이 아님)에 대한 버킷을 반환합니다.
{
"took" : 3,
"timed_out" : false,
"terminated_early" : true,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"top_terms" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 2,
"buckets" : [
{
"key" : "opensearch",
"doc_count" : 3
},
{
"key" : "configuration",
"doc_count" : 1
},
{
"key" : "index",
"doc_count" : 1
},
{
"key" : "management",
"doc_count" : 1
},
{
"key" : "performance",
"doc_count" : 1
}
]
}
}
}
fielddata 설정은 동적으로 갱신할 수 있습니다. 재인덱싱 없이 기존 필드에서 활성화할 수 있습니다.
PUT /fielddata_test/_mapping
{
"properties": {
"title": {
"type": "text",
"fielddata": true
}
}
}
Field data 빈도 필터(Field data frequency filter)
fielddata_frequency_filter 파라미터는 문서 빈도(document frequency)가 지정된 범위 안에 있는 토큰만 로드해 메모리 사용량을 줄입니다. 매우 흔한 토큰(중단 단어 등)이나 극히 드문 토큰(오타 등)은 field data에서 제외되어 힙 소비를 줄이면서도 대부분의 집계 사용 사례를 지원합니다.
다음 표는 fielddata_frequency_filter 파라미터를 나열합니다.
| 파라미터 | 필수/선택 | 데이터 타입 | 설명 |
|---|---|---|---|
min |
필수 | Float | 토큰이 로드되기 위한 최소 문서 빈도(0과 1 사이의 비율)입니다. 이 임계값보다 적은 문서에 나타나는 토큰은 제외됩니다. |
max |
필수 | Float | 토큰이 로드되기 위한 최대 문서 빈도(0과 1 사이의 비율)입니다. 이 임계값보다 많은 문서에 나타나는 토큰은 제외됩니다. |
min_segment_size |
선택 | Integer | 빈도 필터가 적용되기 위해 세그먼트가 포함해야 하는 최소 문서 수입니다. 더 작은 세그먼트는 빈도와 관계없이 모든 토큰을 로드합니다. 기본값은 0입니다. |
다음 예제는 문서의 1%에서 50% 사이에 나타나는 토큰만 로드하고, 이 필터를 최소 100개의 문서가 있는 세그먼트에만 적용합니다.
PUT /my-index
{
"mappings": {
"properties": {
"description": {
"type": "text",
"fielddata": true,
"fielddata_frequency_filter": {
"min": 0.01,
"max": 0.5,
"min_segment_size": 100
}
}
}
}
}