2.X/2. Search in Depth

2-6-07. function_score Query

drscg 2017. 9. 24. 19:21

The function_score query is the ultimate tool for taking control of the scoring process. It allows you to apply a function to each document that matches the main query in order to alter or completely replace the original query _score.

The function_score query는 score 계산 프로세스를 제어할 수 있는 최고의 도구이다. 원래 query의 _score 를 변경하거나, 완전히 대체하기 위하여, query에 일치하는 각 document에 function을 적용할 수 있다.

In fact, you can apply different functions to subsets of the main result set by using filters, which gives you the best of both worlds: efficient scoring with cacheable filters.

사실, filter를 사용하여 주요 결과 집합의 부분 집합(subsets) 에 다른 function을 적용할 수 있다. cache가 가능한 filter로 효율적인 score 계산이 가능하다.

It supports several predefined functions out of the box:

아래에, 미리 정의된 몇 가지 function이 있다.

weight

Apply a simple boost to each document without the boost being normalized: a weight of 2results in 2 * _score.

정규화된 가중치(boost)없이, 각 document에 간단한 가중치를 적용한다. weight 가 2 이면, 결과는 2 * _score

field_value_factor

Use the value of a field in the document to alter the _score, such as factoring in a popularitycount or number of votes.

_score 를 변경하기 위하여, document에 있는 field의 값을 사용한다. 인기 투표 의 수 등을 고려할 때 사용

random_score

Use consistently random scoring to sort results differently for every user, while maintaining the same sort order for a single user.

어떤 한명의 사용자에 대해 동일한 정렬을 유지하면서, 모든 사용자에게 다른 정렬 결과를 보여주기 위하여 일관된 무작위 score 계산을 사용

Decay functionslinearexpgauss

Incorporate sliding-scale values like publish_dategeo_location, or price into the _score to prefer recently published documents, documents near a latitude/longitude (lat/lon) point, or documents near a specified price point.

최근에 쓰여진 document, 특정 위도/경도(latitude/longitude, lat/lon) 지점에 근처의 document, 지정된 가격대 근처의 document를 더 좋아하도록, publish_dategeo_locationprice 같은 값에 차등적으로 _score 를 넣는다.

script_score

Use a custom script to take complete control of the scoring logic. If your needs extend beyond those of the functions in this list, write a custom script to implement the logic that you need.

score 계산 logic의 완벽한 제어를 위하여, 사용자 정의 script를 사용한다. 위에 나열된 것 이상의 확장된 function이 필요하다면, 필요한 logic을 구현하기 위하여 사용자 정의 script를 작성한다.

Without the function_score query, we would not be able to combine the score from a full-text query with a factor like recency. We would have to sort either by _score or by date; the effect of one would obliterate the effect of the other. This query allows you to blend the two together: to still sort by full-text relevance, but giving extra weight to recently published documents, or popular documents, or products that are near the user’s price point. As you can imagine, a query that supports all of this can look fairly complex. We’ll start with a simple use case and work our way up the complexity ladder.

function_score query 없이, 최신(recency) 같은 요소를 full-text query의 score와 조합할 수 없다. _score 나 date 로 정렬할 수 밖에 없다. 한쪽의 효과는 다른 쪽의 효과를 지워버린다. 이 query는 두 개를 같이 조합할 수 있다. 여전히 full-text relevance로 정렬하면서, 최근 document나 인기 있는 document 또는 사용자의 가격대 근처의 상품에 추가로 가중치를 준다. 상상할 수 있겠지만, 위의 상황 모두를 지원하는 query는 매우 복잡할 수 있다. 간단한 적용 사례로 시작하여 복잡한 단계로 올라가 보자.

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

2-6-05. Not Quite Not  (0) 2017.09.24
2-6-06. Ignoring TF/IDF  (0) 2017.09.24
2-6-08. Boosting by Popularity  (0) 2017.09.24
2-6-09. Boosting Filtered Subsets  (0) 2017.09.24
2-6-10. Random Scoring  (0) 2017.09.24