Text 필드 타입
Text 필드 타입
text 필드 타입은 분석되는 문자열을 담아요. 부분 일치를 허용하므로 전체 텍스트 검색에 사용돼요. 여러 용어에 대한 검색은 일부만 일치할 수 있어요. analyzer에 따라 결과는 대소문자 무시, 형태소 분석(stemming), 불용어 제거, 동의어 적용 등을 거칠 수 있어요.
필드를 정확한 값 검색에 사용해야 한다면 대신 keyword로 매핑하세요.
match_only_text 필드는 text 필드의 공간 최적화 버전이에요. 구문 쿼리나 위치(positional) 쿼리를 사용할 필요가 없다면 필드를 text 대신 match_only_text로 매핑하세요. 위치 쿼리는 구문에서 용어의 위치가 중요한 쿼리로, interval이나 span 쿼리 같은 것을 말해요.
출처: 문서
본문
예시
text 필드가 있는 매핑을 만들어 볼게요.
PUT movies
{
"mappings" : {
"properties" : {
"title" : {
"type" : "text"
}
}
}
}
파라미터 (Parameters)
text 필드 타입이 받는 파라미터는 다음 표와 같아요. 모든 파라미터는 선택 사항이에요.
| 파라미터 | 설명 |
|---|---|
analyzer |
이 필드에 사용될 analyzer예요. 기본적으로 색인 시점과 검색 시점 모두에서 사용돼요. 검색 시점에 재정의하려면 search_analyzer 파라미터를 설정해요. 기본값은 문법 기반 토큰화를 사용하고 Unicode Text Segmentation 알고리즘에 기반한 표준 analyzer예요. |
boost |
관련성 점수에 대한 이 필드의 가중치를 지정하는 부동소수점 값이에요. 1.0보다 큰 값은 필드의 관련성을 높이고, 0.0과 1.0 사이의 값은 관련성을 낮춰요. 기본값은 1.0이에요. 동적으로 업데이트 가능해요. |
eager_global_ordinals |
refresh 시 global ordinals를 미리 로드할지 여부를 지정해요. 필드가 집계에 자주 사용된다면 이 파라미터를 true로 설정해야 해요. 기본값은 false예요. 동적으로 업데이트 가능해요. |
fielddata |
정렬, 집계, 스크립팅을 위해 이 필드의 분석된 토큰에 접근할지 여부를 지정하는 불리언 값이에요. 기본값은 false예요. 동적으로 업데이트 가능해요. |
fielddata_frequency_filter |
문서 빈도가 min과 max 값(절대 수 또는 백분율로 제공) 사이인 분석된 토큰만 메모리에 로드하도록 지정하는 JSON 객체예요. 빈도는 세그먼트별로 계산돼요. 파라미터: min, max, min_segment_size. 기본값은 모든 분석된 토큰을 로드하는 거예요. 동적으로 업데이트 가능해요. |
fields |
같은 문자열을 여러 방식으로 색인하려면(예: keyword와 text로 모두) fields 파라미터를 제공해요. 검색에 사용할 필드 버전과 정렬·집계에 사용할 필드 버전을 각각 지정할 수 있어요. |
index |
필드를 검색 가능하게 할지 여부를 지정하는 불리언 값이에요. 기본값은 true예요. |
index_options |
검색과 하이라이팅을 위해 인덱스에 저장할 정보를 지정해요. 유효 값: docs(문서 번호만), freqs(문서 번호와 용어 빈도), positions(문서 번호, 용어 빈도, 용어 위치), offsets(문서 번호, 용어 빈도, 용어 위치, 시작·끝 문자 오프셋). 기본값은 positions예요. |
index_phrases |
2-gram을 별도로 색인할지 여부를 지정하는 불리언 값이에요. 2-gram은 이 필드 문자열에서 연속된 두 단어의 조합이에요. slop 없는 더 빠른 정확한 구문 쿼리를 만들지만 인덱스는 더 커져요. 불용어를 제거하지 않을 때 가장 잘 작동해요. 기본값은 false예요. |
index_prefixes |
용어 접두사를 별도로 색인할지 여부를 지정하는 JSON 객체예요. 접두사의 문자 수는 min_chars와 max_chars 사이(포함)예요. 더 빠른 접두사 검색을 만들지만 인덱스는 더 커져요. 선택 파라미터: min_chars, max_chars. 기본 min_chars는 2, max_chars는 5예요. |
meta |
이 필드에 대한 메타데이터를 받아요. |
norms |
관련성 점수 계산 시 필드 길이를 사용할지 여부를 지정하는 불리언 값이에요. 기본값은 true예요. |
position_increment_gap |
text 필드가 분석되면 위치가 할당돼요. 필드가 문자열 배열을 포함하고 이 위치들이 연속적이라면 서로 다른 배열 요소 간의 매칭이 발생할 수 있어요. 이를 방지하기 위해 연속된 배열 요소 사이에 인위적인 갭이 삽입돼요. 정수 position_increment_gap을 지정해 이 갭을 바꿀 수 있어요. 참고: slop이 position_element_gap보다 크면 서로 다른 배열 요소 간의 매칭이 발생할 수 있어요. 기본값은 100이에요. 동적으로 업데이트 가능해요. |
similarity |
관련성 점수를 계산하는 랭킹 알고리즘이에요. 기본값은 BM25예요. |
term_vector |
이 필드에 대한 용어 벡터를 저장할지 여부를 지정하는 불리언 값이에요. 기본값은 no예요. |
Term vector 파라미터
term vector는 분석 중에 생성돼요. 여기에는 다음이 포함돼요.
- 용어 목록.
- 각 용어의 순서 위치(ordinal position).
- 필드 안 검색 문자열의 시작·끝 문자 오프셋.
- 페이로드(사용 가능한 경우). 각 용어는 용어의 위치와 연관된 사용자 지정 이진 데이터를 가질 수 있어요.
term_vector 필드는 다음 파라미터를 받는 JSON 객체를 포함해요.
| 파라미터 | 저장 값 |
|---|---|
no |
없음. 기본값이에요. |
yes |
필드의 용어. |
with_offsets |
용어와 문자 오프셋. |
with_positions_offsets |
용어, 위치, 문자 오프셋. |
with_positions_offsets_payloads |
용어, 위치, 문자 오프셋, 페이로드. |
with_positions |
용어와 위치. |
with_positions_payloads |
용어, 위치, 페이로드. |
위치를 저장하는 것은 근접성 쿼리에 유용해요. 문자 오프셋을 저장하는 것은 하이라이팅에 유용해요.
Term vector 파라미터 예시
term vector에 문자 오프셋을 저장하는 text 필드가 있는 매핑을 만들어 볼게요.
PUT testindex
{
"mappings" : {
"properties" : {
"dob" : {
"type" : "text",
"term_vector": "with_positions_offsets"
}
}
}
}
text 필드가 있는 문서를 색인해요.
PUT testindex/_doc/1
{
"dob" : "The patient's date of birth."
}
"date of birth"를 쿼리하고 원래 필드에서 하이라이트해요.
GET testindex/_search
{
"query": {
"match": {
"dob": "date of birth"
}
},
"highlight": {
"fields": {
"dob": {}
}
}
}
응답에서 "date of birth" 단어들이 하이라이트돼요.
{
"took" : 854,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.8630463,
"hits" : [
{
"_index" : "testindex",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.8630463,
"_source" : {
"text" : "The patient's date of birth."
},
"highlight" : {
"text" : [
"The patient's date of birth."
]
}
}
]
}
}