2.X/2. Search in Depth

2-3-6. Boosting Query Clauses

drscg 2017. 9. 30. 01:29

Of course, the bool query isn’t restricted to combining simple one-word match queries. It can combine any other query, including other bool queries. It is commonly used to fine-tune the relevance _score for each document by combining the scores from several distinct queries.

물론, bool query는, 간단한 단일 단어(one-word) match query를 조합하는데 있어, 제한이 없다. 다른 bool query는 물론이고, 다른 어떤 query와도 조합할 수 있다. 여러 별개의 query로부터 나온 score를 조합하여, 각 document의 relevance _score 를 미세하게 조정하는데 흔히 사용된다.

Imagine that we want to search for documents about "full-text search", but we want to give more weight to documents that also mention "Elasticsearch" or "Lucene". By more weight, we mean that documents mentioning "Elasticsearch" or "Lucene" will receive a higher relevance _score than those that don’t, which means that they will appear higher in the list of results.

document를 "full-text search" 로 검색을 하는데, "Elasticsearch"나 "Lucene"이라는 단어도 언급된 document에 더 많은 비중(weight) 을 준다고 가정해 보자. 더 많은 비중(more weight) 이라는 말은, "Elasticsearch"나 "Lucene"이 언급된 document가, 그렇지 않은 document보다 더 높은 relevance _score 를 받는다는 의미이다. 따라서 결과 목록에서 더 위쪽에 나타날 것이다.

A simple bool query allows us to write this fairly complex logic as follows:

아래에 간단한 bool query 를 사용해 작성한, 꽤 복잡한 query가 있다.

GET /_search
{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "content": { 
                        "query":    "full text search",
                        "operator": "and"
                    }
                }
            },
            "should": [ 
                { "match": { "content": "Elasticsearch" }},
                { "match": { "content": "Lucene"        }}
            ]
        }
    }
}

content field는 fulltextsearch 3개의 단어 모두를 반드시 포함하고 있어야 한다.

content field가 Elasticsearch 나 Lucene 이라는 단어도 포함하고 있다면, 그 document는 더 높은 _score 를 받게 된다.

The more should clauses that match, the more relevant the document. So far, so good.

일치하는 should 절이 많을수록, document는 더 높은 relevance를 가진다. 지금까지는 순조롭다.

But what if we want to give more weight to the docs that contain Lucene and even more weight to the docs containing Elasticsearch?

그렇다면, Lucene 이라는 단어를 포함하고 있는 document에 더 많은 비중을 주고, Elasticsearch 라는 단어를 포함하고 있는 document에 훨씬 더 많은 가중치를 주려면, 어떻게 해야 할까?

We can control the relative weight of any query clause by specifying a boost value, which defaults to 1. A boost value greater than 1 increases the relative weight of that clause. So we could rewrite the preceding query as follows:

boost 값(기본값: 1)을 지정하여, 특정 query 절의 상대적인 비중을 조절할 수 있다. boost 는 해당 query 절의 상대적인 비중을 증가시키기 위해, 1 보다 큰 값을 지정한다. 따라서, 위의 query를 아래처럼, 다시 작성할 수 있다.

GET /_search
{
    "query": {
        "bool": {
            "must": {
                "match": {  
                    "content": {
                        "query":    "full text search",
                        "operator": "and"
                    }
                }
            },
            "should": [
                { "match": {
                    "content": {
                        "query": "Elasticsearch",
                        "boost": 3 
                    }
                }},
                { "match": {
                    "content": {
                        "query": "Lucene",
                        "boost": 2 
                    }
                }}
            ]
        }
    }
}

이 절은 boost 의 기본값 1 을 사용한다.

가장 높은 boost 를 가진, 이 절이 가장 중요하다.

이 절은 기본보다 더 중요하다. 그러나, Elasticsearch 절만큼 중요하지는 않다.

Note

The boost parameter is used to increase the relative weight of a clause (with a boostgreater than 1) or decrease the relative weight (with a boost between 0 and 1), but the increase or decrease is not linear. In other words, a boost of 2 does not result in double the _score.

boost 매개변수는 query 절의 상대적인 비중을 증가(1 보다 큰 boost) 또는 감소(0 과 1 사이의 boost)시키는데 사용된다. 그러나 증가 또는 감소가 비례하지는 않는다. 즉, boost 의 값이 2 라고 해서, _score 의 값이 2배가 되지는 않는다.

Instead, the new _score is normalized after the boost is applied. Each type of query has its own normalization algorithm, and the details are beyond the scope of this book. Suffice to say that a higher boost value results in a higher _score.

대신, boost가 적용된 후에는, 새로운 _score 가 정규화(normalize) 된다. 각 query의 유형별로 그 자신만의 정규화 알고리즘을 가진다. 그 자세한 사항은 이 책의 범위를 벗어난다. "더 높은 boost 값은 더 높은 _score 로 나타난다" 는 말로 충분할 것이다.

If you are implementing your own scoring model not based on TF/IDF and you need more control over the boosting process, you can use the function_score query tomanipulate a document’s boost without the normalization step.

TF/IDF를 기반으로 하지 않는, 여러분만의 score 계산 model을 구현하여, 가중치 부여 프로세스에 대해 더 많은 제어가 필요하다면, 정규화 단계 없이, document의 가중치를 다루기 위해, function_score query를 사용할 수 있다.

We present other ways of combining queries in the next chapter, Multifield Search. But first, let’s take a look at the other important feature of queries: text analysis.

다음 장(Multifield Search)에서, query를 조합하는 다른 방법을 알아 볼 것이다. 그러나 먼저, query의 다른 중요한 특징인, 문장 분석(text analysis)을 살펴보도록 하자.

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

2-2-4. Combining Queries  (0) 2017.09.30
2-3-5. How match Uses bool  (0) 2017.09.30
2-2-7. Controlling Analysis  (0) 2017.09.30
2-2-8. Relevance Is Broken!  (0) 2017.09.30
2-3. Multifield Search  (0) 2017.09.30