2.X/2. Search in Depth

2-2-3. Multiword Queries

drscg 2017. 9. 30. 01:41

If we could search for only one word at a time, full-text search would be pretty inflexible. Fortunately, the match query makes multiword queries just as simple:

한번에 한 단어만을 검색할 수 있다면, full-text 검색은 아주 융통성 없는 검색일 것이다. 하지만, matchquery는 간단하게 여러 단어로 된 query를 만들 수 있다.

GET /my_index/my_type/_search
{
    "query": {
        "match": {
            "title": "BROWN DOG!"
        }
    }
}

The preceding query returns all four documents in the results list:

위의 query는 결과 목록에 모두 4개의 document를 반환한다.

{
  "hits": [
     {
        "_id":      "4",
        "_score":   0.73185337, 
        "_source": {
           "title": "Brown fox brown dog"
        }
     },
     {
        "_id":      "2",
        "_score":   0.47486103, 
        "_source": {
           "title": "The quick brown fox jumps over the lazy dog"
        }
     },
     {
        "_id":      "3",
        "_score":   0.47486103, 
        "_source": {
           "title": "The quick brown fox jumps over the quick dog"
        }
     },
     {
        "_id":      "1",
        "_score":   0.11914785, 
        "_source": {
           "title": "The quick brown fox"
        }
     }
  ]
}

Document 4는 "brown" 이 두 번, "dog" 이 한번 나타나기 때문에, 가장 관련있다.

 

Document 2 와 3은 brown 과 dog 이 각각 한번씩 있고, title field의 길이가 같기 때문에, 동일한 relevance(_score)를 가진다.

Document 1은 dog 없이 brown 만을 포함하고 있으나, 일치한다.

Because the match query has to look for two terms—["brown","dog"] —internally it has to execute two term queries and combine their individual results into the overall result. To do this, it wraps the two term queries in a bool query, which we examine in detail in Combining Queries.

match query는 ["brown","dog"] 이라는 두 개의 단어를 찾아야 하기 때문에, 내부적으로 두 번의 term query를 실행하고, 각각의 결과를 조합하여, 최종 결과를 만들어낸다. 이렇게 하기 위해, 두 번의 termquery를 하나의 bool query로 감싸는 것이다. Combining Queries에서 자세히 살펴볼 것이다.

The important thing to take away from this is that any document whose title field contains at least one of the specified terms will match the query. The more terms that match, the more relevant the document.

위에서 알 수 있는 중요한 점은, title field가 지정한 단어 중 최소한 하나를 포함하는 모든 document가, query에 일치한다는 점이다. 일치하는 단어가 많을수록, relevance(_score)가 더 높다.

Improving Precisionedit

Matching any document that contains any of the query terms may result in a long tail of seemingly irrelevant results. It’s a shotgun approach to search. Perhaps we want to show only documents that contain all of the query terms. In other words, instead of brown OR dog, we want to return only documents that match brown AND dog.

검색어(query terms) 중 어떤 하나(any) 를 포함하는 document는, 겉보기에는, 관련이 없는 쓸데없는 결과일지도 모른다. 무차별적인 검색이다. 모든(all) 검색어(query terms)를 포함하는 document만 원할 수도 있다. 즉, brown 또는 dog 이 아닌 brown 그리고 dog 과 일치하는 document만 원할 수도 있다.

The match query accepts an operator parameter that defaults to or. You can change it to and to require that all specified terms must match:

match query는 operator 매개변수를 지원하는데, or 가 기본값이다. 지정된 단어 모두가 반드시 일치해야 한다면, and 로 변경할 수 있다.

GET /my_index/my_type/_search
{
    "query": {
        "match": {
            "title": {      
                "query":    "BROWN DOG!",
                "operator": "and"
            }
        }
    }
}

operator 매개변수를 넣기 위해, match query의 구조를 약간 변경해야 한다.

This query would exclude document 1, which contains only one of the two terms.

이 query는 두 단어 중 하나만을 포함하는 document 1을 제외한다.

Controlling Precisionedit

The choice between all and any is a bit too black-or-white. What if the user specified five query terms, and a document contains only four of them? Setting operator to and would exclude this document.

all 과 any 는 양자 택일이다. 사용자가 5개의 검색어를 지정했고, document는 그들 중 4개만 포함하고 있다면, 어떻게 될까? operator 매개변수에 and 를 설정하면, 이 document는 결과에서 제외될 것이다.

Sometimes that is exactly what you want, but for most full-text search use cases, you want to include documents that may be relevant but exclude those that are unlikely to be relevant. In other words, we need something in-between.

때로는, 정확히 그것이 원하는 것이다. 하지만, 대부분의 full-text 검색 사용 사례에서, 관련이 있을 것 같은 document는 결과에 포함되고, 관련 없을 것 같은 document는 제외되기를 원할 것이다. 즉, 중간의 어떤 것이 필요하다.

The match query supports the minimum_should_match parameter, which allows you to specify the number of terms that must match for a document to be considered relevant. While you can specify an absolute number of terms, it usually makes sense to specify a percentage instead, as you have no control over the number of words the user may enter:

match query는 minimum_should_match 매개변수를 제공한다. 이것은 관련있는 것으로 간주되기 위해, document에 대해 반드시 일치해야 하는 단어의 수를 지정할 수 있다. 단어의 수를 직접 지정할 수도 있지만, 사용자가 얼마나 많은 단어를 입력할 지 알 수 없기 때문에, 비율(%)을 지정하는 것이 일반적이다.

GET /my_index/my_type/_search
{
  "query": {
    "match": {
      "title": {
        "query":                "quick brown dog",
        "minimum_should_match": "75%"
      }
    }
  }
}

When specified as a percentage, minimum_should_match does the right thing: in the preceding example with three terms, 75% would be rounded down to 66.6%, or two out of the three terms. No matter what you set it to, at least one term must match for a document to be considered a match.

비율로 지정되는 경우, minimum_should_match 는 올바르게 동작할 것이다. 3개의 단어를 가진 위의 예에서, 75% 는 66.6% 로 내림 되거나, 3개의 단어 중 2개가 된다. 무엇으로 설정하든, document에 대해, 최소한 하나 이상의 단어가 반드시 일치해야, 일치하는 것으로 간주된다.

Note

The minimum_should_match parameter is flexible, and different rules can be applied depending on the number of terms the user enters. For the full documentation see the minimum_should_match

minimum_should_match 매개변수는 매우 유연하며, 사용자가 입력한 단어의 수에 따라 적용되는 다양한 규칙이다. 전체 설명은 minimum_should_match를 참고하자.

To fully understand how the match query handles multiword queries, we need to look at how to combine multiple queries with the bool query.

match query가 다중 단어 query를 처리하는 방법을 완전히 이해하기 위해, 다수의 query를 bool query로 조합하는 방법을 살펴봐야 한다.


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

2-2-1. Term-Based Versus Full-Text  (0) 2017.09.30
2-2-2. The match Query  (0) 2017.09.30
2-2-4. Combining Queries  (0) 2017.09.30
2-3-5. How match Uses bool  (0) 2017.09.30
2-3-6. Boosting Query Clauses  (0) 2017.09.30