completion 필드 타입
completion 필드 타입
도입: 1.0
completion 필드 타입은 completion suggester를 통해 자동 완성 기능을 제공해요. completion suggester는 접두어 suggester이므로 텍스트의 시작 부분만 매칭해요. completion suggester는 인메모리 데이터 구조를 만들어 더 빠른 조회를 제공하지만 메모리 사용량이 늘어나요. 이 기능을 사용하기 전에 가능한 모든 완성 목록을 인덱스에 업로드해야 해요.
출처: 문서
본문
예제
completion 필드가 있는 매핑을 만들어요:
PUT chess_store
{
"mappings": {
"properties": {
"suggestions": {
"type": "completion"
},
"product": {
"type": "keyword"
}
}
}
}
매핑 파라미터
completion 필드 타입은 다음 매핑 파라미터를 지원해요.
| 파라미터 | 설명 |
|---|---|
analyzer |
입력 텍스트에 대한 인덱스 시점 analyzer를 지정. 기본값은 simple. Index analyzers 참고. |
search_analyzer |
검색 시점에 사용되는 analyzer를 정의. 기본값은 analyzer 값. Search analyzers 참고. |
preserve_separators |
true(기본값)이면 공백이나 구두점 같은 구분자를 유지. false로 설정하면 queensg 같은 쿼리가 "Queen's Gambit" 같은 제안과 매칭될 수 있음. |
preserve_position_increments |
true(기본값)이면 분석된 토큰의 위치 증가분을 유지. false로 설정하면 "The" 같은 stopword를 건너뛰기 때문에 s라고 입력할 때 "The Sicilian Defense" 같은 제안이 매칭될 수 있음. 또는 analyzer를 변경하지 않고 "Sicilian Defense"와 "The Sicilian Defense"를 별도의 입력으로 인덱스할 수도 있음. |
max_input_length |
각 입력 문자열의 길이를 제한. 기본값은 50 UTF-16 코드 포인트. 큰 입력이 기본 데이터 구조를 부풀리는 것을 방지하기 위해 인덱스 시점에만 적용됨. 대부분의 접두어 완성은 이 한도 내에서 잘 동작함. 동적으로 업데이트 가능. |
예제 매핑
PUT chess_store
{
"mappings": {
"properties": {
"suggestions": {
"type": "completion",
"analyzer": "standard"
},
"product": {
"type": "keyword"
}
}
}
}
OpenSearch에 제안을 인덱스해요:
PUT chess_store/_doc/1
{
"suggestions": {
"input": ["Books on openings", "Books on endgames"],
"weight" : 10
}
}
파라미터
다음 표는 completion 필드가 받는 파라미터를 나열해요.
| 파라미터 | 설명 |
|---|---|
input |
문자열 또는 문자열 배열로 된 가능한 완성 목록. \u0000(null), \u001f(정보 구분자 1), \u001e(정보 구분자 2)를 포함할 수 없음. 필수. |
weight |
제안의 순위를 위한 양의 정수 또는 양의 정수 문자열. 선택 사항. |
여러 제안을 다음과 같이 인덱스할 수 있어요:
PUT chess_store/_doc/2
{
"suggestions": [
{
"input": "Chess set",
"weight": 20
},
{
"input": "Chess pieces",
"weight": 10
},
{
"input": "Chess board",
"weight": 5
}
]
}
대안으로 다음 축약 표기법을 사용할 수도 있어요(이 표기법에서는 weight 파라미터를 제공할 수 없음에 유의):
PUT chess_store/_doc/3
{
"suggestions" : [ "Chess clock", "Chess timer" ]
}
completion 필드 타입 쿼리하기
completion 필드 타입을 쿼리하려면 검색하려는 접두어와 제안을 찾을 필드의 이름을 지정하세요. "chess"라는 단어로 시작하는 제안을 인덱스에서 쿼리해요:
GET chess_store/_search
{
"suggest": {
"product-suggestions": {
"prefix": "chess",
"completion": {
"field": "suggestions"
}
}
}
}
응답에는 자동 완성 제안이 포함돼요:
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"suggest" : {
"product-suggestions" : [
{
"text" : "chess",
"offset" : 0,
"length" : 5,
"options" : [
{
"text" : "Chess set",
"_index" : "chess_store",
"_type" : "_doc",
"_id" : "2",
"_score" : 20.0,
"_source" : {
"suggestions" : [
{
"input" : "Chess set",
"weight" : 20
},
{
"input" : "Chess pieces",
"weight" : 10
},
{
"input" : "Chess board",
"weight" : 5
}
]
}
},
{
"text" : "Chess clock",
"_index" : "chess_store",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"suggestions" : [
"Chess clock",
"Chess timer"
]
}
}
]
}
]
}
}
응답에서 _score 필드는 인덱스 시점에 설정된 weight 파라미터의 값을 포함해요. text 필드는 제안의 input 파라미터로 채워져요.
기본적으로 응답은 _source 필드를 포함한 전체 문서를 포함하므로 성능에 영향을 줄 수 있어요. suggestions 필드만 반환하려면 _source 파라미터에 지정하면 돼요. 또한 size 파라미터를 지정해 반환되는 제안 수를 제한할 수도 있어요.
GET chess_store/_search
{
"_source": "suggestions",
"suggest": {
"product-suggestions": {
"prefix": "chess",
"completion": {
"field": "suggestions",
"size" : 3
}
}
}
}
응답에는 제안이 포함돼요:
{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"suggest" : {
"product-suggestions" : [
{
"text" : "chess",
"offset" : 0,
"length" : 5,
"options" : [
{
"text" : "Chess set",
"_index" : "chess_store",
"_type" : "_doc",
"_id" : "2",
"_score" : 20.0,
"_source" : {
"suggestions" : [
{
"input" : "Chess set",
"weight" : 20
},
{
"input" : "Chess pieces",
"weight" : 10
},
{
"input" : "Chess board",
"weight" : 5
}
]
}
},
{
"text" : "Chess clock",
"_index" : "chess_store",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"suggestions" : [
"Chess clock",
"Chess timer"
]
}
}
]
}
]
}
}
source 필터링을 활용하려면 _search 엔드포인트에서 suggest 기능을 사용하세요. _suggest 엔드포인트는 source 필터링을 지원하지 않아요.
completion 쿼리 파라미터
다음 표는 completion suggester 쿼리가 받는 파라미터를 나열해요.
| 파라미터 | 설명 |
|---|---|
field |
쿼리를 실행할 필드를 지정하는 문자열. 필수. |
size |
반환되는 최대 제안 수를 지정하는 정수. 선택 사항. 기본값은 5. |
skip_duplicates |
중복 제안을 건너뛸지 지정하는 Boolean 값. 선택 사항. 기본값은 false. |
Fuzzy completion 쿼리
퍼지(fuzzy) 매칭을 허용하려면 completion 쿼리에 fuzziness 파라미터를 지정할 수 있어요. 이 경우 사용자가 검색어를 잘못 입력해도 completion 쿼리는 여전히 결과를 반환해요. 또한 쿼리와 매칭되는 접두어가 길수록 문서의 점수는 더 높아져요.
GET chess_store/_search
{
"suggest": {
"product-suggestions": {
"prefix": "chesc",
"completion": {
"field": "suggestions",
"size" : 3,
"fuzzy" : {
"fuzziness" : "AUTO"
}
}
}
}
}
모든 기본 fuzziness 옵션을 사용하려면 "fuzzy": {} 또는 "fuzzy": true를 지정하세요.
다음 표는 fuzzy completion suggester 쿼리가 받는 파라미터를 나열해요. 모든 파라미터는 선택적이에요.
| 파라미터 | 설명 |
|---|---|
fuzziness |
다음 중 하나로 설정할 수 있음: 1. 이 편집에 허용되는 최대 Damerau–Levenshtein 거리를 지정하는 정수. 2. AUTO: 0 |
min_length |
제안 반환을 시작하는 데 필요한 입력의 최소 길이를 지정하는 정수. 검색어가 min_length보다 짧으면 제안이 반환되지 않음. 기본값은 3. |
prefix_length |
제안 반환을 시작하는 데 필요한 매칭 접두어의 최소 길이를 지정하는 정수. prefix_length의 접두어가 매칭되지 않아도 검색어가 여전히 Damerau–Levenshtein 거리 안에 있으면 제안이 반환되지 않음. 기본값은 1. |
transpositions |
인접한 문자 상호 교환(전치)을 두 번이 아닌 한 번의 편집으로 계산할지 지정하는 Boolean 값. 예: 제안의 input 파라미터가 abcde이고 fuzziness가 1일 때, transpositions가 true이면 abdce가 매칭되지만 false이면 매칭되지 않음. 기본값은 true. |
unicode_aware |
편집 거리, 전치, 길이를 측정할 때 Unicode 코드 포인트를 사용할지 지정하는 Boolean 값. unicode_aware가 true이면 측정이 더 느려짐. 기본값은 false로, 이 경우 거리는 바이트로 측정됨. |
정규식 쿼리
정규식을 사용해 completion suggester 쿼리의 접두어를 정의할 수 있어요.
예를 들어 "a"로 시작하고 뒤에 "d"가 있는 문자열을 검색하려면 다음 쿼리를 사용해요:
GET chess_store/_search
{
"suggest": {
"product-suggestions": {
"regex": "a.*d",
"completion": {
"field": "suggestions"
}
}
}
}
응답은 문자열 "abcde"와 매칭돼요:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"suggest" : {
"product-suggestions" : [
{
"text" : "a.*d",
"offset" : 0,
"length" : 4,
"options" : [
{
"text" : "abcde",
"_index" : "chess_store",
"_type" : "_doc",
"_id" : "2",
"_score" : 20.0,
"_source" : {
"suggestions" : [
{
"input" : "abcde",
"weight" : 20
}
]
}
}
]
}
]
}
}