2.X/2. Search in Depth

2-5. Partial Matching

drscg 2017. 9. 24. 21:09

A keen observer will notice that all the queries so far in this book have operated on whole terms. To match something, the smallest unit had to be a single term. You can find only terms that exist in the inverted index.

눈썰미가 좋은 독자라면, 지금까지 이 책의 모든 query는 전체 단어를 기준으로 동작된다는 것을 알아차렸을 것이다. 어떤 것과 일치한다는 것은, 가장 작은 단위가 단일 단어이어야 한다. inverted index에 존재하는 단어만을 검색할 수 있다.

But what happens if you want to match parts of a term but not the whole thing? Partial matchingallows users to specify a portion of the term they are looking for and find any words that contain that fragment.

그러나, 전체가 아닌 단어의 일부분이 일치해야 한다면 어떻게 될까? 부분 일치(Partial matching) 는 사용자가 검색하려는 단어의 일부를 지정하고, 해당 조각을 포함하는 모든 단어를 검색하는 것이다.

The requirement to match on part of a term is less common in the full-text search-engine world than you might think. If you have come from an SQL background, you likely have, at some stage of your career, implemented a poor man’s full-text search using SQL constructs like this:

full-text 검색 엔진의 세계에서, 단어의 일부가 일치하는 상황은 여러분들이 생각하는 것보다 덜 일반적이다. SQL을 알고 있다면, SQL 구문을 이용하여 아래와 같이 빈약한 full-text 검색 을 구현할 수 있다.

    WHERE text LIKE "%quick%"
      AND text LIKE "%brown%"
      AND text LIKE "%fox%" 

*fox* 는 "fox", "foxes" 와 일치할 것이다.

Of course, with Elasticsearch, we have the analysis process and the inverted index that remove the need for such brute-force techniques. To handle the case of matching both "fox" and "foxes", we could simply use a stemmer to index words in their root form. There is no need to match partial terms.

물론, Elasticsearch는 분석 프로세스와, 무차별 대입(brute-force) 기술 같은 것이 필요하지 않는 inverted index를 가지고 있다. "fox" 와 "foxes" 모두에 일치하는 경우를 처리하기 위해서, 단순히 단어의 원형으로 단어를 색인하는, 형태소 분석기(stemmer)를 사용할 수 있다. 단어의 일부에 일치할 필요가 없다.

That said, on some occasions partial matching can be useful. Common use cases include the following:

그렇지만, 어떤 경우에는 부분 일치가 유용할 수 있다. 일반적인 사용 예는 아래와 같다.

  • Matching postal codes, product serial numbers, or other not_analyzed values that start with a particular prefix or match a wildcard pattern or even a regular expression

    우편번호, 제품 일련 번호 또는 특별한 접두어로 시작하는 다른 not_analyzed 값에 일치하거나, 어떤 wildcard pattern이나 정규식에 일치

  • search-as-you-type—displaying the most likely results before the user has finished typing the search terms

    Instant(순간) 검색(search-as-you-type)—사용자가 검색어 입력을 끝내기 전에, 가장 가능성 있는 결과를 표시

  • Matching in languages like German or Dutch, which contain long compound words, like Weltgesundheitsorganisation (World Health Organization)

    Weltgesundheitsorganisation (World Health Organization - 세계보건기구)처럼, 긴 복합어를 포함하는 독일어(German), 네델란드어(Dutch) 같은 언어에서의 일치

We will start by examining prefix matching on exact-value not_analyzed fields.

exact-value not_analyzed field에 대한 접두어 일치를 확인하면서, 시작해 보자.

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

2-4-6. Improving Performance  (0) 2017.09.24
2-4-7. Finding Associated  (0) 2017.09.24
2-5-1. Postcodes and Structured Data  (0) 2017.09.24
2-5-2. prefix Query  (0) 2017.09.24
2-5-3. wildcard and regexp Queries  (0) 2017.09.24