2.X/2. Search in Depth

2-6-09. Boosting Filtered Subsets

drscg 2017. 9. 24. 19:17

Let’s return to the problem that we were dealing with in Ignoring TF/IDF, where we wanted to scorevacation homes by the number of features that each home possesses. We ended that section by wishing for a way to use cached filters to affect the score, and with the function_score query we can do just that.

Ignoring TF/IDF에서 다루었던 문제로 돌아가 보면, 여기에서는 각 여름용 별장이 가지고 있는 기능의 수로, 별장에 score를 계산하려 했다. score에 영향을 미치는 cached filter를 사용하는 방법으로 마무리 지었고, function_score query로 그것을 할 수 있다.

The examples we have shown thus far have used a single function for all documents. Now we want to divide the results into subsets by using filters (one filter per feature), and apply a different function to each subset.

지금까지 보여준 예들은, 모든 document에 대해 단일 function을 사용하고 있다. 이제, filter(기능별로 하나의 filter)를 사용하여 결과를 하위 집합으로 분할하고, 각 하위집합에 서로 다른 function을 적용해 보자.

The function that we will use in this example is the weight, which is similar to the boost parameter accepted by any query. The difference is that the weight is not normalized by Lucene into some obscure floating-point number; it is used as is.

이 예에서 사용하려는 function은 weight 이다. 이것은 어떤 query에서도 사용할 수 있는 boost 매개변수와 유사하다. 차이점은 weight 는 Lucene에 의해, 모호한 부동 소수점 수로 정규화되지 않는다는 것이다. 그냥 그대로 사용된다.

The structure of the query has to change somewhat to incorporate multiple functions:

query 구조는 다수의 function을 포함하기 위하여 약간 변경된다.

GET /_search
{
  "query": {
    "function_score": {
      "filter": { 
        "term": { "city": "Barcelona" }
      },
      "functions": [ 
        {
          "filter": { "term": { "features": "wifi" }}, 
          "weight": 1
        },
        {
          "filter": { "term": { "features": "garden" }}, 
          "weight": 1
        },
        {
          "filter": { "term": { "features": "pool" }}, 
          "weight": 2 
        }
      ],
      "score_mode": "sum", 
    }
  }
}

function_score query는 query 대신 filter 를 가진다.

functions key는 적용하려는 function의 목록을 가진다.

  

function은 filter(옵션)에 일치하는 document에게만 적용된다.

pool 기능은 다른 기능보다 중요하기 때문에, weight 가 더 높다.

score_mode 는 각 function의 값이 조합되는 방법을 지정한다.

The new features to note in this example are explained in the following sections.

이 예에서 나타난 몇 가지 새로운 기능들을 다음에서 설명한다.

filter Versus queryedit

The first thing to note is that we have specified a filter instead of a query. In this example, we do not need full-text search. We just want to return all documents that have Barcelona in the cityfield, logic that is better expressed as a filter instead of a query. All documents returned by the filter will have a _score of 1. The function_score query accepts either a query or a filter. If neither is specified, it will default to using the match_all query.

첫 번째는 query 대신에 filter 를 지정한 것이다. 이 예에서, full-text 검색은 필요 없다. 단지, city field에 Barcelona 를 가지고 있는 모든 document가 반환되기를 원할 뿐이다. query보다는 filter로 더 잘 표현되는 logic이다. filter에 의해 반환되는 모든 document는 _score 가 1 이다. function_score query는query 나 filter 를 가질 수 있다. 아무것도 지정되지 않으면, 기본적으로 match_all query가 사용된다.

functionsedit

The functions key holds an array of functions to apply. Each entry in the array may also optionally specify a filter, in which case the function will be applied only to documents that match that filter. In this example, we apply a weight of 1 (or 2 in the case of pool) to any document that matches the filter.

functions key는 적용할 function의 배열을 가진다. 배열의 각 요소는 옵션으로 filter 를 지정할 수도 있다. 이 경우에 function은 해당 filter에 일치하는 document에게만 적용된다. 이 예에서, filter에 일치하는 모든 document에게 weight 1 을, pool 의 경우에는 2 를 적용한다.

score_modeedit

Each function returns a result, and we need a way of reducing these multiple results to a single value that can be combined with the original _score. This is the role of the score_mode parameter, which accepts the following values:

각 function이 결과를 반환하면, 다수의 결과를, 원래의 _score 와 조합될 수 있도록, 하나의 값으로 줄일 방법이 필요하다. 이것이 score_mode 매개변수의 역할이다. 아래와 같은 값을 가질 수 있다.

multiply

Function results are multiplied together (default).

function의 결과를 서로 곱한다. (기본값)

sum

Function results are added up.

function의 결과를 더한다.

avg

The average of all the function results.

모든 function 결과의 평균값

max

The highest function result is used.

function의 결과 중 가장 큰 값이 사용된다.

min

The lowest function result is used.

function의 결과 중 가장 작은 값이 사용된다.

first

Uses only the result from the first function that either doesn’t have a filter or that has a filter matching the document.

filter를 가지지 않거나, document와 일치하는 filter를 가진, 첫 번째 function에서 나온 결과만을 사용한다.

In this case, we want to add the weight results from each matching filter together to produce the final score, so we have used the sum score mode.

이 예에서, score_mode 에 sum 을 사용했기 때문에, 최종 score를 만들어 내기 위해 filter에 일치하는 각 결과의 weight 를 더한다.

Documents that don’t match any of the filters will keep their original _score of 1.

어떤 filter에도 일치하지 않는 document는 원래의 _score 1 그대로이다.


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

2-6-07. function_score Query  (0) 2017.09.24
2-6-08. Boosting by Popularity  (0) 2017.09.24
2-6-10. Random Scoring  (0) 2017.09.24
2-6-11. The Closer, The Better  (0) 2017.09.24
2-6-12. Understanding the price Clause  (0) 2017.09.24