리스코어(rescore) 파라미터

리스코어(rescore) 파라미터

rescore 파라미터는 초기 쿼리에서 반환된 가장 높은 순위의 문서만 다시 정렬해 검색 정밀도를 높여요. 인덱스의 모든 문서에 값비싼 알고리즘을 적용하는 대신, 리스코어링은 보조 점수 방법을 사용해 상위 결과의 더 작은 창(window)을 재순위화하는 데 계산 리소스를 집중합니다.

검색 요청에 rescore 파라미터를 포함하면 OpenSearch는 결과를 다음 순서로 처리해요.

  1. 초기 검색: 기본 쿼리와 모든 사후 필터가 모든 관련 문서에 대해 실행돼요.
  2. 샤드 레벨 리스코어링: 각 샤드가 상위 결과에 리스코어링 알고리즘을 적용해요.
  3. 최종 조정: 조정(coordination) 노드가 모든 샤드의 리스코어된 결과를 결합해요.

이 접근 방식은 허용 가능한 성능을 유지하면서 더 나은 관련성을 제공해요.

rescore 파라미터를 사용할 때 다음 중요한 고려 사항을 기억하세요.

  • 리스코어링에는 명시적 정렬(내림차순 _score를 제외)을 사용할 수 없어요. 사용자 지정 정렬과 rescore 쿼리를 결합하려 하면 OpenSearch가 오류를 반환합니다.
  • 페이지네이션을 구현할 때 모든 페이지에서 동일한 window_size를 유지해야 해요. 페이지 간에 창 크기를 변경하면 사용자가 검색 결과를 탐색할 때 결과 불일치가 발생할 수 있어요.
  • 하이브리드 쿼리와 함께 리스코어링을 사용할 때 rescore 쿼리는 정규화와 결합 전에 각 하위 쿼리의 결과에 샤드 레벨에서 개별적으로 적용되고, 조정 노드의 최종 병합 결과에는 적용되지 않아요.

출처: 문서

본문

쿼리 리스코어링 (Query rescoring)

쿼리 리스코어링은 보조 쿼리를 적용해 상위 순위 문서의 점수를 정제해요. 각 샤드가 검사하는 문서 수는 window_size 파라미터(기본값 10)로 제어할 수 있어요.

기본 리스코어링 문법

POST /_search
{
  "query": {
    "match": {
      "content": {
        "query": "OpenSearch query optimization",
        "operator": "or"
      }
    }
  },
  "rescore": {
    "window_size": 100,
    "query": {
      "rescore_query": {
        "match_phrase": {
          "content": {
            "query": "OpenSearch query optimization",
            "slop": 1
          }
        }
      },
      "query_weight": 0.8,
      "rescore_query_weight": 1.3
    }
  }
}

리스코어 파라미터

rescore 객체는 다음 파라미터를 지원해요.

  • window_size (Integer): 샤드당 리스코어할 상위 문서 수예요. 기본값은 10이에요.
  • query_weight (Float): 원래 쿼리 점수에 적용되는 가중치예요. 기본값은 1.0이에요.
  • rescore_query_weight (Float): 리스코어 쿼리 점수에 적용되는 가중치예요. 기본값은 1.0이에요.
  • score_mode (String): 원래 쿼리 점수와 리스코어 쿼리 점수를 결합하는 방법이에요. 기본값은 total이고, Score combination modes를 참고하세요.

점수 결합 모드 (Score combination modes)

score_mode 파라미터는 OpenSearch가 원래 점수와 리스코어 쿼리 점수를 어떻게 결합하는지 결정해요. 이 파라미터는 다음 값을 받아요.

  • total: 원래 점수 + 리스코어 점수를 더해요. 일반적인 관련성 개선(기본값)용이에요.
  • multiply: 원래 점수 × 리스코어 점수를 곱해요. 0~1 사이의 값을 반환하는 함수 쿼리에 효과적이에요.
  • avg: 두 점수의 평균을 구해요. 두 점수가 동등하게 중요할 때 균형 잡힌 접근이에요.
  • max: 두 점수 중 더 높은 값을 사용해요. 어느 쿼리에서든 높은 점수를 가진 문서가 잘 순위가 매겨지도록 보장해요.
  • min: 두 점수 중 더 낮은 값을 사용해요. 두 쿼리가 모두 일치해야 하는 보수적인 접근이에요.

여러 리스코어링 단계 (Multiple rescoring stages)

점점 더 정교해지는 순위 알고리즘을 적용하려면 여러 리스코어링 작업을 연결할 수 있어요.

POST /_search
{
  "query": {
    "match": {
      "title": {
        "query": "search engine technology",
        "operator": "or"
      }
    }
  },
  "rescore": [
    {
      "window_size": 200,
      "query": {
        "rescore_query": {
          "match_phrase": {
            "title": {
              "query": "search engine technology",
              "slop": 2
            }
          }
        },
        "query_weight": 0.6,
        "rescore_query_weight": 1.4
      }
    },
    {
      "window_size": 50,
      "query": {
        "score_mode": "multiply",
        "rescore_query": {
          "function_score": {
            "script_score": {
              "script": {
                "source": "Math.log10(doc['popularity'].value + 2)"
              }
            }
          }
        }
      }
    }
  ]
}

이 다중 단계 예제에서:

  • 첫 번째 리스코어링 단계는 샤드당 200개 문서를 검사하며, 구문 매칭을 적용해 관련성을 개선해요.
  • 두 번째 리스코어링 단계는 첫 번째 단계의 상위 50개 결과를 가져와 로그 함수를 사용한 인기도 기반 점수를 적용해요.
  • 각 단계는 이전 단계의 결과를 처리해 정제 파이프라인을 만들고, 계산 비용이 높은 연산은 가장 유망한 후보에만 작동해요.

더 알아보기 (Learn more)