2.X/2. Search in Depth

2-5-4. Query-Time Search-as-You-Type

drscg 2017. 9. 24. 21:03

Leaving postcodes behind, let’s take a look at how prefix matching can help with full-text queries.Users have become accustomed to seeing search results before they have finished typing their query—so-called instant search, or search-as-you-typeNot only do users receive their search results in less time, but we can guide them toward results that actually exist in our index.

우편번호를 뒤로 하고, prefix 일치가 full-text query에 이용되는 방법을 살펴보자. 사용자들은 query의 입력을 완료하기 전에, 검색 결과를 보는 것에 익숙해져 있는데, 이를 instant 검색 또는 search-as-you-type이라 한다. 사용자들은 더 짧은 시간 안에 검색 결과를 받을 수 있고, 사용자들을 index내에 실제로 존재하는 결과 쪽으로 안내할 수 있다.

For instance, if a user types in johnnie walker bl, we would like to show results for Johnnie Walker Black Label and Johnnie Walker Blue Label before they can finish typing their query.

예를 들어, 사용자가 johnnie walker bl 이라고 입력하면, 사용자가 입력을 완료하기 전에, Johnnie Walker Black Label 과 Johnnie Walker Blue Label 에 대한 결과를 보여 줄 것이다.

As always, there are more ways than one to skin a cat! We will start by looking at the way that is simplest to implement. You don’t need to prepare your data in any way; you can implement search-as-you-type at query time on any full-text field.

언제나처럼, 목적을 달성하는 방법에는 여러 가지가 있다. 구현하기에 가장 간단한 방식으로 시작할 것이다. 모든 방법으로 데이터를 준비할 필요는 없다. 모든 full-text field에 대해, 검색 시에 instant 검색 을 구현할 수 있다.

In Phrase Matching, we introduced the match_phrase query, which matches all the specified words in the same positions relative to each other. For-query time search-as-you-type, we can use a specialization of this query, called the match_phrase_prefix query:

Phrase Matching에서, 서로에 대해 상대적으로 동일한 위치에 있는, 지정된 단어 모두에 일치하는 match_phrase query를 소개한 적이 있다. 검색 시의 instant 검색을 위해, match_phrase_prefix query라 불리는, 이 query의 특별한 버전을 사용할 수 있다.

{
    "match_phrase_prefix" : {
        "brand" : "johnnie walker bl"
    }
}

This query behaves in the same way as the match_phrase query, except that it treats the last word in the query string as a prefix. In other words, the preceding example would look for the following:

이 query는 query string의 마지막 단어를 접두어로 다룬다는 점을 제외하고는, match_phrase query와 동일한 방식으로 동작한다. 다시 말하면, 위의 예제는 다음과 같다.

  • johnnie
  • Followed by walker

    walker 가 뒤따른다.

  • Followed by words beginning with bl

    bl 로 시작하는 단어가 뒤따른다.

If you were to run this query through the validate-query API, it would produce this explanation:

validate-query API를 통해 이 query를 실행해 보면, 다음과 같은 explanation을 만들어 낼 것이다.

"johnnie walker bl*"

Like the match_phrase query, it accepts a slop parameter (see Mixing It Up) to make the word order and relative positions somewhat less rigid:

match_phrase query와 마찬가지로, 단어 순서와 상대적 위치를 다소 융통성 있게 만들기 위해, slop 매개변수(Mixing It Up 참조)를 넣을 수 있다.

{
    "match_phrase_prefix" : {
        "brand" : {
            "query": "walker johnnie bl", 
            "slop":  10
        }
    }
}

단어가 올바르지 않은 순서로 있다 하더라도, 단어 위치에 약간의 유연성을 주기 위해, 충분히 높은 slop 값을 설정했기 때문에, query는 여전히 일치한다.

However, it is always only the last word in the query string that is treated as a prefix.

그러나, query string에서 마지막 단어는 항상 접두사로 처리된다.

Earlier, in prefix Query, we warned about the perils of the prefix—how prefix queries can be resource intensive. The same is true in this case. A prefix of a could match hundreds of thousands of terms. Not only would matching on this many terms be resource intensive, but it would also not be useful to the user.

초반에, prefix Query에서, prefix의 위험성(prefix query가 얼마나 집중적으로 자원을 사용하는지)에 대해 경고한 바 있다. 이 경우에도 마찬가지이다. 접두어 a 는 수백 수천 단어와 일치할 것이다. 이 많은 단어와 일치시키기 위해 집중적인 자원 사용이 일어나나, 사용자에게는 그리 유용하지 않을 것이다.

We can limit the impact of the prefix expansion by setting max_expansions to a reasonable number, such as 50:

50 정도의 합리적인 수를 max_expansions 에 설정하여, prefix의 확장에 따른 영향을 제한할 수 있다.

{
    "match_phrase_prefix" : {
        "brand" : {
            "query":          "johnnie walker bl",
            "max_expansions": 50
        }
    }
}

The max_expansions parameter controls how many terms the prefix is allowed to match. It will find the first term starting with bl and keep collecting terms (in alphabetical order) until it either runs out of terms with prefix bl, or it has more terms than max_expansions.

max_expansions 매개변수는 prefix에 얼마나 많은 단어를 일치시킬지를 제어한다. bl 로 시작하는 첫 번째 단어를 찾고, 접두어 bl 로 시작하는 단어가 더 이상 없거나 max_expansions 보다 더 많은 단어를 가질 때까지 (알파벳순으로) 단어를 수집한다.

Don’t forget that we have to run this query every time the user types another character, so it needs to be fast. If the first set of results isn’t what users are after, they’ll keep typing until they get the results that they want.

사용자가 다른 문자를 입력할 때마다, 이 query를 실행해야 한다는 점을 잊지 말자. 따라서, 충분히 빨라야 한다. 결과의 첫 번째 집합이 사용자가 찾는 것이 아니라면, 찾는 결과를 얻을 때까지 계속 입력할 것이다.

'2.X > 2. Search in Depth' 카테고리의 다른 글

2-5-2. prefix Query  (0) 2017.09.24
2-5-3. wildcard and regexp Queries  (0) 2017.09.24
2-5-5. Index-Time Optimizations  (0) 2017.09.24
2-5-6. Ngrams for Partial Matching  (0) 2017.09.24
2-5-7. Index-Time Search-as-You-Type  (0) 2017.09.24