Fuzzy 쿼리

Fuzzy 쿼리

검색 용어와 유사한 용어를 포함한 문서를 최대 허용 Damerau–Levenshtein 거리 안에서 찾으려면 fuzzy 쿼리를 사용해요. 오타나 철자 차이를 허용하며 검색하고 싶을 때 유용해요.

출처: 문서

본문

fuzzy 쿼리는 검색 용어와 유사한 용어를 포함한 문서를 최대 허용 Damerau–Levenshtein 거리 안에서 검색해요. Damerau–Levenshtein 거리는 한 용어를 다른 용어로 바꾸는 데 필요한 한 문자 단위 변경 횟수를 측정해요. 여기에는 다음 변경이 포함돼요:

  • 치환(Replacements): cat → bat
  • 삽입(Insertions): cat → cats
  • 삭제(Deletions): cat → at
  • 전치(Transpositions): cat → act fuzzy 쿼리는 Damerau-Levenshtein 거리 안에 들어오는 검색 용어의 모든 가능한 확장(expansion) 목록을 만듭니다. max_expansions 필드에서 이러한 확장의 최대 개수를 지정할 수 있어요. 그러면 쿼리는 확장 중 하나라도 일치하는 문서를 검색해요. transpositions 파라미터를 false로 설정하면 검색은 고전적인 Levenshtein 거리를 사용해요. 다음 예제 쿼리는 HALET(철자가 틀린 HAMLET)이라는 화자를 검색해요. 최대 편집 거리를 지정하지 않았으므로 기본 AUTO 편집 거리가 사용돼요:
GET shakespeare/_search
{
  "query": {
    "fuzzy": {
      "speaker": {
        "value": "HALET"
      }
    }
  }
}

응답에는 HAMLET이 화자인 모든 문서가 포함돼요. 다음 예제 쿼리는 고급 파라미터로 HALET 단어를 검색해요:

GET shakespeare/_search
{
  "query": {
    "fuzzy": {
      "speaker": {
        "value": "HALET",
        "fuzziness": "2",
        "max_expansions": 40,
        "prefix_length": 0,
        "transpositions": true,
        "rewrite": "constant_score"
      }
    }
  }
}

파라미터 (Parameters)

쿼리는 필드 이름()을 최상위 파라미터로 받아요:

GET _search
{
  "query": {
    "fuzzy": {
      "": {
        "value": "sample",
        ...
      }
    }
  }
}

는 다음 파라미터를 받아요. value를 제외한 모든 파라미터는 선택이에요. Parameter Data type Description value | 문자열(String) | 에 지정된 필드에서 검색할 용어예요. boost | 부동 소수점(Floating-point) | 이 필드가 관련성 점수에 기여하는 가중치를 지정하는 부동 소수점 값이에요. 1.0보다 큰 값은 필드의 관련성을 높이고, 0.0과 1.0 사이의 값은 관련성을 낮춰요. 기본값은 1.0이에요. fuzziness | AUTO, 0 또는 양의 정수 | 용어가 값과 일치하는지 판단할 때 한 단어를 다른 단어로 바꾸는 데 필요한 문자 편집 횟수(삽입, 삭제, 대체)예요. 예를 들어 wined와 wind 사이의 거리는 1이에요. 기본값인 AUTO는 검색 용어의 길이에 따라 편집 거리를 동적으로 선택해요. AUTO:[low],[high] 문법으로 임계값을 사용자 지정할 수 있으며, 여기서 low와 high는 문자 길이 경계를 정의해요. 생략하면 OpenSearch는 기본값으로 AUTO:3,6을 사용하며, 다음 규칙을 적용해요: - 0–2자 용어: 정확히 일치해야 해요 (0회 편집). - 3–5자 용어: 최대 1회 편집을 허용해요. - 6자 이상 용어: 최대 2회 편집을 허용해요. 예를 들어 AUTO:4,7은 0–3자 용어에 대해 정확히 일치를 요구하고, 4–6자 용어에는 최대 1회 편집, 7자 이상 용어에는 최대 2회 편집을 허용해요. 대부분의 시나리오에서는 AUTO 사용을 권장해요. max_expansions | 양의 정수 | 쿼리가 확장할 수 있는 최대 용어 수예요. fuzzy 쿼리는 fuzziness에 지정된 거리 안에 있는 일치하는 용어들로 "확장"돼요. 그런 다음 OpenSearch가 그 용어들을 일치시키려고 해요. 기본값은 50이에요. prefix_length | 0 이상의 정수 | fuzziness에서 고려하지 않는 앞부분 문자의 수예요. 기본값은 0이에요. rewrite | 문자열(String) | OpenSearch가 다중 용어 쿼리를 어떻게 다시 작성하고 점수를 매기는지 결정해요. 유효한 값은 constant_score, scoring_boolean, constant_score_boolean, top_terms_N, top_terms_boost_N, top_terms_blended_freqs_N이에요. 기본값은 constant_score예요. transpositions | 불리언(Boolean) | 두 인접 문자를 서로 바꾸는 전치(ab → ba)를 편집으로 허용할지 지정해요. 기본값은 true예요.

max_expansions에 큰 값을 지정하면 성능이 저하될 수 있어요. 특히 prefix_length가 0으로 설정된 경우에는 OpenSearch가 일치시키려고 시도하는 단어 변형이 많아지기 때문이에요. search.allow_expensive_queries가 false로 설정되어 있으면 fuzzy 쿼리는 실행되지 않아요.

더 알아보기 (Learn more)