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: 02자 문자열은 정확히 일치해야 하고, 35자 문자열은 1회 편집을 허용하며, 5자보다 긴 문자열은 2회 편집을 허용. 기본값은 AUTO.
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
                }
              ]
            }
          }
        ]
      }
    ]
  }
}

더 알아보기 (Learn more)