In Combining Filters we discussed how to use the bool
filter to combine multiple filter clauses with and
, or
, and not
logic. In query land, the bool
query does a similar job but with one important difference.
Combining Filters에서, 다수의 filter 절을 and
, or
, not
으로 조합하기 위해, 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 must
, must_not
, and should
parameters. For instance:
filter와 마찬가지로, bool
query는 must
, must_not
, should
매개변수 아래에, 다수의 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" } } ] }
Score Calculationedit
The bool
query calculates the relevance _score
for each document by adding together the _score
from all of the matching must
and should
clauses, and then dividing by the total number of must
and 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 |