2.X/3. Dealing with Human Language

3-7-2. Fuzzy Query

drscg 2017. 9. 24. 12:30

The fuzzy query is the fuzzy equivalent of the term query. You will seldom use it directly yourself, but understanding how it works will help you to use fuzziness in the higher-level match query.

fuzzy query term query와 어떤 면에서 유사하다. 그것을 직접 사용할 리는 거의 없을 것이다. 그러나, 그것이 동작하는 방법을 이해하면, 높은 수준의 match query에서, fuzziness를 사용하는데 도움이 될 것이다.

To understand how it works, we will first index some documents:

그것이 동작하는 방법을 이해하기 위해, 먼저 몇 개의 document를 색인하자.

POST /my_index/my_type/_bulk
{ "index": { "_id": 1 }}
{ "text": "Surprise me!"}
{ "index": { "_id": 2 }}
{ "text": "That was surprising."}
{ "index": { "_id": 3 }}
{ "text": "I wasn't surprised."}

Now we can run a fuzzy query for the term surprize:

이제, 단어 surprize 에 대한 fuzzy query를 실행해 보자.

GET /my_index/my_type/_search
{
  "query": {
    "fuzzy": {
      "text": "surprize"
    }
  }
}

The fuzzy query is a term-level query, so it doesn’t do any analysis. It takes a single term and finds all terms in the term dictionary that are within the specified fuzziness. The default fuzziness is AUTO.

fuzzy query는, 어떤 분석도 하지 않는, 단어 수준(term-level)의 query이다. 하나의 단어를 받아, 지정된 fuzziness 내에서, 단어 사전에 있는 모든 단어를 찾는다. fuzziness 의 기본값은 AUTO 이다.

In our example, surprize is within an edit distance of 2 from both surprise and surprised, so documents 1 and 3 match. We could reduce the matches to just surprise with the following query:

예제에서, surprize 는 surprise 와 surprised 양쪽에서 편집 거리 2보다 작다. 따라서, document 1과 3은 일치한다. 다음 query처럼, surprise 만 일치하도록, 축소할 수 있다.

GET /my_index/my_type/_search
{
  "query": {
    "fuzzy": {
      "text": {
        "value": "surprize",
        "fuzziness": 1
      }
    }
  }
}

Improving Performanceedit

The fuzzy query works by taking the original term and building a Levenshtein automaton—like a big graph representing all the strings that are within the specified edit distance of the original string.

fuzzy query는, 원래 문자열의 지정된 편집 거리 내에서, 모든 문자열을 나타내는 커다란 그래프처럼, 원래의 단어를 가지고, Levenshtein Automaton 을 만들어, 동작한다.

The fuzzy query then uses the automaton to step efficiently through all of the terms in the term dictionary to see if they match. Once it has collected all of the matching terms that exist in the term dictionary, it can compute the list of matching documents.

그 다음에, 그들이 일치하는지 알아보기 위하여, 단어 사전의 단어 모두를 통한 효율적인 과정을 통해, automaton을 사용한다. 단어 사전에 존재하는, 일치하는 단어 모두를 수집하면, 일치하는 document의 목록을 계산할 수 있다.

Of course, depending on the type of data stored in the index, a fuzzy query with an edit distance of 2 can match a very large number of terms and perform very badly. Two parameters can be used to limit the performance impact:

물론, index에 저장된 데이터의 형태에 따라, 편집 거리 2인 fuzzy query는 매우 많은 단어와 일치할 수 있고, 매우 안 좋게 수행될 수 있다. 성능에 미치는 영향을 제한하기 위해, 2개의 매개변수를 사용할 수 있다.

prefix_length

The number of initial characters that will not be "fuzzified." Most spelling errors occur toward the end of the word, not toward the beginning. By using a prefix_length of 3, for example, you can signficantly reduce the number of matching terms.

"퍼지화(fuzzified)" 하지 않을 기본 문자의 수. 대부분의 맞춤법 오류는 단어의 시작 부분이 아닌, 끝 부분에서 나타난다. 예를 들어, prefix length 를 3 으로 사용하면, 일치하는 단어의 수를 대폭 감소시킬 수 있다.

max_expansions

If a fuzzy query expands to three or four fuzzy options, the new options may be meaningful. If it produces 1,000 options, they are essentially meaningless. Use max_expansions to limit the total number of options that will be produced. The fuzzy query will collect matching terms until it runs out of terms or reaches the max_expansions limit.

fuzzy query가 fuzzy 옵션을 3이나 4로 확장하면, 새로운 옵션은 의미가 있을 것이다. 1,000개의 옵션을 만들어내면, 그것은 본질적으로 무의미하다. 만들어지는 옵션의 수를 제한하기 위하여, max_expansions 를 사용하자. fuzzy query는 단순히 단어가 부족하거나, max_expansions 제한에 이를 때까지 일치하는 단어를 수집할 것이다.


'2.X > 3. Dealing with Human Language' 카테고리의 다른 글

3-7. Typoes and Mispelings  (0) 2017.09.24
3-7-1. Fuzziness  (0) 2017.09.24
3-7-3. Fuzzy match Query  (0) 2017.09.24
3-7-4. Scoring Fuzziness  (0) 2017.09.24
3-7-5. Phonetic Matching  (0) 2017.09.24