2.X/2. Search in Depth

2-2-4. Combining Queries

drscg 2017. 9. 30. 01:37

In Combining Filters we discussed how to use the bool filter to combine multiple filter clauses with andor, and not logic. In query land, the bool query does a similar job but with one important difference.

Combining Filters에서, 다수의 filter 절을 andornot 으로 조합하기 위해, bool filter를 사용하는 방법에 대해 이야기한 바 있다. query에서도, bool query는 비슷한 작용을 하지만, 한가지 중요한 차이점이 있다.

Filters make a binary decision: should this document be included in the results list or not? Queries, however, are more subtle. They decide not only whether to include a document, but also how relevant that document is.

filter는 yes/no의 결과(이 document가 결과 목록에 포함되는지 여부)를 가진다. 그러나 query에서는 좀 더 정교하다. document의 포함 여부뿐만 아니라 해당 document가 얼마나 관련(relevant)있는 지도 결정한다.

Like the filter equivalent, the bool query accepts multiple query clauses under the mustmust_not, and should parameters. For instance:

filter와 마찬가지로, bool query는 mustmust_notshould 매개변수 아래에, 다수의 query 절을 가진다. 예를 들면,

GET /my_index/my_type/_search
{
  "query": {
    "bool": {
      "must":     { "match": { "title": "quick" }},
      "must_not": { "match": { "title": "lazy"  }},
      "should": [
                  { "match": { "title": "brown" }},
                  { "match": { "title": "dog"   }}
      ]
    }
  }
}

The results from the preceding query include any document whose title field contains the term quick, except for those that also contain lazy. So far, this is pretty similar to how the bool filter works.

위 query의 결과는, title field에 quick 을 가지고 있는 document는 포함되고, lazy 를 가지고 있는 document는 제외한다. 지금까지는 bool filter의 역할과 아주 유사하다.

The difference comes in with the two should clauses, which say that: a document is not required to contain either brown or dog, but if it does, then it should be considered more relevant:

차이점은 두 개의 should 절에서 나타난다. 결과에 포함되는 document는 brown 이나 dog 를 포함할 필요가 없다. 그러나, 만약 가지고 있다면, 그 document는 더 관련있는 것으로 간주된다.

{
  "hits": [
     {
        "_id":      "3",
        "_score":   0.70134366, 
        "_source": {
           "title": "The quick brown fox jumps over the quick dog"
        }
     },
     {
        "_id":      "1",
        "_score":   0.3312608,
        "_source": {
           "title": "The quick brown fox"
        }
     }
  ]
}

Document 3이 browndog 양쪽 모두를 가지고 있기 때문에, _score 가 더 높다.

Score Calculationedit

The bool query calculates the relevance _score for each document by adding together the _scorefrom all of the matching must and should clauses, and then dividing by the total number of mustand should clauses.

bool query는 must 와 should 절에 일치하는 모든 document에서 구한 _score 를 모두 더하여, 각 document의 relevance _score 를 계산한다. 그리고, must 와 should 절의 총 수로 나눈다.

The must_not clauses do not affect the score; their only purpose is to exclude documents that might otherwise have been included.

must_not 절은 score에 영향을 미치지 않는다. must_not 절은, must_not 을 사용하지 않았을 경우 포함될 document를 제외하는 것이, 목적이기 때문이다.

Controlling Precisionedit

All the must clauses must match, and all the must_not clauses must not match, but how many should clauses should match? By default, none of the should clauses are required to match, with one exception: if there are no must clauses, then at least one should clause must match.

must 절 모두는 반드시 일치해야 하고, must_not 절 모두는 반드시 일치하지 않아야 한다. 그런데 should 절은 얼마나 일치해야 할까? 기본적으로, should 절은 일치할 필요가 없다. 단 하나의 예외는, must 절이 없는 경우에, should 절 중 최소한 하나는 반드시 일치해야 한다.

Just as we can control the precision of the match query, we can control how many should clauses need to match by using the minimum_should_match parameter, either as an absolute number or as a percentage:

match query의 정확도를 제어할 수 있는 것처럼, minimum_should_match 매개변수(단어의 수를 나타내는 숫자 또는 비율)를 사용하여, should 절이 얼마나 일치해야 하는지를 제어할 수 있다.

GET /my_index/my_type/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title": "brown" }},
        { "match": { "title": "fox"   }},
        { "match": { "title": "dog"   }}
      ],
      "minimum_should_match": 2 
    }
  }
}

이는 비율(%)로 표시할 수도 있다.

The results would include only documents whose title field contains "brown" AND "fox""brown" AND "dog", or "fox" AND "dog". If a document contains all three, it would be considered more relevant than those that contain just two of the three.

위 query의 결과는, title field에 "brown" AND "fox" 또는 "brown" AND "dog" 또는 "fox" AND "dog" 를 가지고 있는, document만을 포함할 것이다. 만약 document가 3개 모두를 포함하고 있다면, 3개 중 2개만을 포함한 document보다 더 관련 있는 것으로 간주된다.


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

2-2-2. The match Query  (0) 2017.09.30
2-2-3. Multiword 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
2-2-7. Controlling Analysis  (0) 2017.09.30