2.X/2. Search in Depth

2-6-03. Query-Time Boosting

drscg 2017. 9. 24. 19:32

In Prioritizing Clauses, we explained how you could use the boost parameter at search time to give one query clause more importance than another. For instance:

Prioritizing Clauses에서, 어떤 query 절이 다른 것보다 더 중요하다는 의미로, 검색 시에 boost 매개변수를 사용하는 방법을 설명한 바 있다. 예를 들면,

GET /_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": {
              "query": "quick brown fox",
              "boost": 2 
            }
          }
        },
        {
          "match": { 
            "content": "quick brown fox"
          }
        }
      ]
    }
  }
}

가중치가 2 가 부여되었기 때문에, title query 절은 content query 절보다 두 배 중요하다.

boost 값이 없는 query 절은 기본 가중치인 1 이다.

Query-time boosting is the main tool that you can use to tune relevance. Any type of query accepts a boost parameter. Setting a boost of 2 doesn’t simply double the final _score; the actual boost value that is applied goes through normalization and some internal optimization. However, it does imply that a clause with a boost of 2 is twice as important as a clause with a boost of 1.

query시 가중치 는, relevance를 조정하는데 사용할 수 있는, 주요 tool이다. 모든 형태의 query는 boost매개변수를 가질 수 있다. boost 를 2 로 설정하는 것이 단순히 최종 _score 를 두 배로 만드는 것이 아니다. 실제로 적용되는 가중치 값은 정규화와 약간의 내부 최적화를 통해 처리된다. 그러나, boost 2 를 가진 절은 boost 1 을 가진 절의 두 배만큼 중요하다는 의미를 가진다.

Practically, there is no simple formula for deciding on the "correct" boost value for a particular query clause. It’s a matter of try-it-and-see. Remember that boost is just one of the factors involved in the relevance score; it has to compete with the other factors. For instance, in the preceding example, the title field will probably already have a "natural" boost over the content field thanks to the field-length norm (titles are usually shorter than the related content), so don’t blindly boost fields just because you think they should be boosted. Apply a boost and check the results. Change the boost and check again.

사실상, 특정 query 절을 위한 "올바른" 가중치 값을 결정하는, 간단한 수식은 없다. 그것은 적용 후 검토(try-it-and-see)의 문제이다. 가중치(boost) 는 relevance score에 포함된 요소 중 하나일 뿐이라는 것을 기억하자. 그것은 다른 요소들과 함께 완성되어야 한다. 예를 들어, 위의 예제에서, 아마도 title field는, field-length norm때문에, 이미 content field 이상의 "자연스러운" 가중치를 가질 것이다. title은 일반적으로 관련된 content보다 더 짧기 때문이다. 그래서, 가중치를 부여해야 한다는 생각 때문에, 맹목적으로 field에 가중치를 부여해서는 안된다. 가중치를 적용하고 결과를 확인하자. 그리고 가중치를 바꾸고 다시 확인하자.

Boosting an Indexedit

When searching across multiple indices, you can boost an entire index over the others with the indices_boost parameter. This could be used, as in the next example, to give more weight to documents from a more recent index:

여러 index를 검색하는 경우, indices_boost 매개변수를 사용하여, 다른 index 이상으로 특정 index 전체에 가중치를 부여할 수 있다. 다음 예제에서 알 수 있듯이, 이것은 더 최근인 index에 있는 document에, 더 많은 비중을 주기 위해 사용될 수 있다.

GET /docs_2014_*/_search 
{
  "indices_boost": { 
    "docs_2014_10": 3,
    "docs_2014_09": 2
  },
  "query": {
    "match": {
      "text": "quick brown fox"
    }
  }
}

이 다중 index 검색은 docs_2014_ 로 시작하는 모든 index에서 찾는다.

docs_2014_10 index에 있는 document는 3 이라는 가중치가 부여되고, docs_2014_09 index에 있는 document는 2 라는 가중치가 부여되고, 다른 일치하는 index에 있는 document는 기본 가중치 1이 부여된다.

t.getBoost()edit

These boost values are represented in the Lucene’s Practical Scoring Function by the t.getBoost()element. Boosts are not applied at the level that they appear in the query DSL. Instead, any boost values are combined and passed down to the individual terms. The t.getBoost() method returns any boost value applied to the term itself or to any of the queries higher up the chain.

Lucene’s Practical Scoring Function에서, 이러한 가중치 값은 t.getBoost() 요소로 나타낸다. 가중치는 query DSL에 표시되는 수준에서는 적용되지 않는다. 대신, 임의의 가중치 값은 조합되고, 개별 단어에 전달된다. t.getBoost() 메서드는, 단어 자체나 chain 위쪽의 query에 적용된, 가중치(boost) 값을 반환한다.

Tip

In fact, reading the explain output is a little more complex than that. You won’t see the boost value or t.getBoost() mentioned in the explanation at all. Instead, the boost is rolled into the queryNorm that is applied to a particular term. Although we said that the queryNorm is the same for every term, you will see that the queryNorm for a boosted term is higher than the queryNorm for an unboosted term.

사실, explain 출력을 읽는 것은, 이것보다 약간 더 복잡하다. explanation 에 언급된 가중치값이나 t.getBoost() 를 전혀 알 수 없을 것이다. 대신, 가중치는 특정 단어에 적용된 queryNorm을 합쳐서 하나로 만든 것이다. 비록 queryNorm 이 모든 단어에 대해 같다고 했지만, 가중치가 적용된 단어에 대한 queryNorm 은, 가중치가 적용되지 않은 단어에 대한 queryNorm 보다, 더 높다는 것을 알 수 있을 것이다.