[Elasticsearch] 제어 상관도 (5) - function_score 조회 및 field_value_factor,boost_mode,max_mode 매개 변수

15810 단어 ElasticsearchSearch
이 장은 Elasticsearch 공식 안내서의 Controlling Relevance 장에서 번역되었습니다.

function_score 조회


function_score 조회는 점수 계산 과정을 처리하는 궁극적인 도구입니다.메인 검색에 일치하는 모든 문서에 함수를 호출하여 원래의 _를 완전히 바꿀 수 있습니다score.
실제로 필터를 설정해서 조회한 결과를 몇 개의 서브집합으로 나누어 서브집합마다 다른 함수를 사용할 수 있다.이렇게 하면 효율적인 값 계산과 캐시 가능한 필터 덕분이다.
그것은 몇 가지 미리 정의된 함수를 가지고 있다.
weight
각 문서에 대한 간단한 승급이 적용되며 이 승급은 요약되지 않습니다: weight가 2인 경우 결과는 2*_score.
field_value_factor
문서의 필드 값을 사용하여 변경_score, 예를 들어 인기 정도나 투표 수량을 고려한다.
random_score
일치성 랜덤 값 계산을 사용하여 모든 사용자에게 서로 다른 결과 정렬 방식을 사용하고, 같은 사용자에게는 여전히 같은 정렬 방식을 사용한다.
감쇠 함수(Decay Function) - linear, exp, gauss
publish_date,geo_location이나 price 같은 부동값은 _score에서 최근에 발표된 문서를 선호합니다. 지리적 위치(역주: 그중의 특정한 필드)에 가까운 문서나 가격(역주: 그중의 특정한 필드)에 가까운 문서입니다.
script_score
사용자 정의 스크립트를 사용하여 값 계산 논리를 완전히 제어합니다.만약 상기 미리 정의된 함수 이외의 기능이 필요하다면, 필요에 따라 스크립트를 통해 실현할 수 있다.
기능 없음_score 검색을 하면 전체 텍스트 검색을 점수와 근인을 결합할 수 없을 수도 있습니다.우리는 어쩔 수 없이_score 또는date로 정렬하기;어떤 것을 채택하든지 다른 영향을 지울 것이다.function_score 조회는 두 가지를 융합시킬 수 있습니다. 여전히 전문 관련도를 통해 정렬되지만, 최근에 발표된 문서나 유행하는 문서, 또는 사용자 가격의 기대에 부합되는 문서에 대한 추가 권한을 부여합니다.너는 이 모든 기능을 갖춘 조회가 상당히 복잡해 보일 것이라고 상상할 수 있다.우리는 간단한 예부터 차근차근 그것에 대해 소개한다.

인기에 따라 상승(Boosting by Popularity)


가령 우리가 블로그 사이트를 하나 가지고 사용자에게 그들이 좋아하는 글을 선택하도록 투표하라고 한다.우리는 인기가 높은 글을 결과 목록의 머리에 등장시키기를 희망하지만, 주요 정렬 근거는 여전히 전문 검색 점수이다.우리는 각 문장의 투표 수량을 저장함으로써 실현할 수 있다.
PUT /blogposts/post/1
{
  "title":   "About popularity",
  "content": "In this post we will talk about...",
  "votes":   6
}

검색 중 field_ 사용value_factor 함수의 function_score 쿼리는 투표 수와 전체 텍스트 관련 점수 값을 결합합니다.
GET /blogposts/post/_search
{
  "query": {
    "function_score": { 
      "query": { 
        "multi_match": {
          "query":    "popularity",
          "fields": [ "title", "content" ]
        }
      },
      "field_value_factor": { 
        "field": "votes" 
      }
    }
  }
}

function_score 쿼리는 기본 쿼리(Main Query)와 적용할 함수를 포함합니다.먼저 주 조회를 실행하고 일치하는 문서에 해당하는 함수를 호출합니다.모든 문서에는votes 필드가 있어야 function_score가 작용할 수 있다.
앞의 예에서 각 문서의 최종_score는 다음과 같은 방식으로 변경됩니다.
new_score = old_score * number_of_votes
그것이 얻은 결과는 결코 좋지 않다.전체 텍스트 검색의_스코어는 보통 0에서 10 사이입니다.다음 그림에서 알 수 있듯이 10표를 가진 문장의 점수는 이 범위를 크게 초과하고 투표되지 않은 문장의 점수는 0으로 리셋된다.
modifier
votes 값이 최종 점수에 미치는 영향을 완화시키기 위해서modifier를 사용할 수 있습니다.다시 말하면 첫 번째 표의 효과가 더욱 뚜렷해지고 그 후의 표의 영향이 점점 줄어들어야 한다는 것이다.0표와 1표의 차이는 10표와 11표의 차이보다 훨씬 클 것이다.
이 장면에 사용되는 전형적인 modifier는log1p입니다. 공식을 이렇게 바꿉니다.
new_score = old_score * log(1 + number_of_votes)
log 함수는 votes 필드의 효과를 늦추고 그 효과는 아래의 곡선과 유사합니다.
modifier 매개 변수를 사용한 요청은 다음과 같습니다.
GET /blogposts/post/_search
{
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query":    "popularity",
          "fields": [ "title", "content" ]
        }
      },
      "field_value_factor": {
        "field":    "votes",
        "modifier": "log1p" 
      }
    }
  }
}

사용 가능한modifiers는none(기본값),log,log1p,log2p,ln,ln1p,ln2p,square,sqrt 및reciprocal입니다.그것들의 상세한 기능과 사용법은field_value_factor 문서.
factor
votes 필드의 값을 곱하여 필드의 영향력을 증가시킬 수 있습니다. 이 값을 factor라고 합니다.
GET /blogposts/post/_search
{
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query":    "popularity",
          "fields": [ "title", "content" ]
        }
      },
      "field_value_factor": {
        "field":    "votes",
        "modifier": "log1p",
        "factor":   2 
      }
    }
  }
}

factor가 추가되어 공식을 다음과 같이 수정합니다.
new_score = old_score * log(1 + factor * number_of_votes)
factor가 1보다 크면 그 영향력이 증가하고, 1보다 작은 factor는 그 영향력을 감소시킨다. 아래 그림과 같다.
boost_mode
전체 텍스트 검색의 상관 관계 분수를 field_ 곱하기value_factor 함수의 결과는 최종 점수에 대한 영향이 너무 클 수 있습니다.boost_를 통해mode 매개 변수, 함수의 결과를 어떻게 _와score가 결합되어 다음 값을 수락합니다.
  • multiply:_score 곱하기 함수 결과(기본값)
  • sum:_score 플러스 함수 결과
  • min:_score와 함수 결과의 작은 값
  • max:_score와 함수 결과의 비교적 큰 값
  • replace:장_score를 함수 결과로 바꿉니다

  • 만약 우리가 함수 결과를 누적해서 얻는다면_score, 그 영향은 매우 적을 것이다. 특히 우리가 비교적 낮은 factor를 사용했을 때:
    GET /blogposts/post/_search
    {
      "query": {
        "function_score": {
          "query": {
            "multi_match": {
              "query":    "popularity",
              "fields": [ "title", "content" ]
            }
          },
          "field_value_factor": {
            "field":    "votes",
            "modifier": "log1p",
            "factor":   0.1
          },
          "boost_mode": "sum" 
        }
      }
    }

    위의 요청 공식은 다음과 같습니다.
    new_score = old_score + log(1 + 0.1 * number_of_votes)
    max_boost
    마지막으로 우리는 max_boost 매개 변수는 함수의 최대 영향을 제한합니다.
    GET /blogposts/post/_search
    {
      "query": {
        "function_score": {
          "query": {
            "multi_match": {
              "query":    "popularity",
              "fields": [ "title", "content" ]
            }
          },
          "field_value_factor": {
            "field":    "votes",
            "modifier": "log1p",
            "factor":   0.1
          },
          "boost_mode": "sum",
          "max_boost":  1.5 
        }
      }
    }

    필드를 막론하고_value_factor 함수의 결과는 얼마입니까? 1.5보다 크지 않습니다.
    NOTE
    max_boost는 함수의 결과에 제한이 있을 뿐 최종적인 것은 아니다_score.

    좋은 웹페이지 즐겨찾기