[Elasticsearch] 제어 상관도(6) - function_score 조회 중인 filter,functions 및random_score 매개 변수

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

필터링 서브셋에 따라 향상(Boosting Filtered Subsets)


TF/IDF(Ignoring TF/IDF)에서 처리한 문제로 돌아가면 리조트 호텔마다 보유한 판매점 수량에 따라 그들의 관련도 점수를 계산해야 한다.우리는 캐시 필터를 이용하여 점수에 영향을 주고 싶지만,function_스코어는 바로 이 목표를 실현할 수 있다.
현재의 예에서, 우리는 모든 문서를 위해 함수를 사용했다.현재 우리는 필터를 사용하여 결과를 서브집합 (하나의 판매점은 하나의 필터에 대응) 으로 나누고 모든 서브집합에 다른 함수를 적용하기를 희망한다.
우리가 사용하는 함수 이름은weight입니다. 이것은 조회에서 받아들인 boost 매개 변수와 유사합니다.차이점은 weight가 Lucene에 의해 어떤 부동점수로 규범화되지 않는다는 것이다.그것은 원형으로 사용될 것이다.
쿼리의 구조는 여러 함수를 수용하기 위해 변경되어야 합니다.
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", 
    }
  }
}

위 예제에서 설명한 새로운 특성은 다음 소절에서 설명합니다.

필터 vs 조회


우선, 우리는 function_score에서 사용하는 것은query가 아니라 filter입니다.상례에서 우리는 전체 텍스트 검색을 사용할 필요가 없다.도시 필드에 바르셀로나의 모든 문서가 나왔을 뿐, 이 논리는 필터로 표현하는 것이 더 적합하다.필터에서 가져온 모든 문서의_스코어는 모두 1입니다.function_score는 조회나 필터를 받아들일 것입니다.아무것도 지정되지 않으면 match_all 조회.

함수(Functions)


functions 배열은 일련의 적용해야 할 함수를 지정하는 데 사용됩니다.그룹의 모든 함수는 선택할 수 있는 필터를 받아들일 수 있으며, 이 필터의 요구를 충족시키는 문서만 함수에 적용됩니다.위의 예에서 모든 일치하는 문서에 대해weight는 1(수영장에 대해서는 2)으로 설정됩니다.

score_mode


모든 함수는 하나의 결과를 되돌려줍니다. 우리는 여러 결과를 하나로 요약한 다음에 원시적인 _score 에 들어가다.score_mode 매개변수는 다음과 같은 값을 얻을 수 있는 요약 작업을 지정합니다.
multiply: 함수 결과 곱하기 (기본 동작) sum: 함수 결과 누적 avg: 모든 함수 결과의 평균값 얻기max: 최대 함수 결과 얻기min: 최소 함수 결과 얻기first: 첫 번째 함수만 사용한 결과, 이 함수는 필터가 있을 수도 있고, 없을 수도 있습니다전례에서 우리는 모든 함수의 결과를 더해서 최종 점수를 얻기를 원하기 때문에 score_를 사용한다모드는sum입니다.
일치하는 필터가 없는 문서는 원래 _score, 즉 1.

무작위 점수 계산(Random Scoring)


무작위 점수 계산이 무엇인지, 아니면 왜 그것을 사용해야 하는지 궁금할 수도 있다.앞의 예는 비교적 좋은 용례를 제공했다.이 예의 모든 결과의 최종_score는 1, 2, 3, 4 또는 5입니다.아마도 아주 적은 리조트 호텔만이 5점을 가질 수 있을 것이다. 그러나 우리는 많은 호텔의 점수가 2 또는 3이라고 가정할 수 있다.
사이트의 소유자로서, 당신은 당신의 광고 투입자에게 가능한 한 많은 기회를 주어 그들의 내용을 보여주기를 희망합니다.현재 질의를 사용하여 동일한_score의 결과는 매번 되돌아오는 순서가 같다.이때 어느 정도의 랜덤성을 도입하면 같은 점수를 가진 문서가 모두 동등한 전시 기회를 가질 수 있도록 보장할 수 있다.
우리는 모든 사용자가 서로 다른 무작위 순서를 볼 수 있기를 희망하지만, 같은 사용자에 대해 그가 두 번째 페이지, 세 번째 페이지 또는 후속 페이지를 클릭할 때 보는 순서는 반드시 같아야 한다.이것이 바로 이른바 일치성 랜덤(Consistently Random)이다.
random_score 함수, 출력은 0에서 1 사이의 숫자입니다. 같은 seed 값을 제공할 때 일치성 랜덤 결과를 만들 수 있습니다. 이 seed 값은 사용자의 세션(Session) ID가 될 수 있습니다.
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
        },
        {
          "random_score": { 
            "seed":  "the users session id" 
          }
        }
      ],
      "score_mode": "sum",
    }
  }
}

random_score 자구는 필터를 포함하지 않기 때문에 모든 문서에 적용됩니다.
물론 검색에 일치하는 새 문서를 인덱스하면 일치성 랜덤을 사용하든 안 사용하든 결과의 순서가 바뀔 수 있습니다.

좋은 웹페이지 즐겨찾기