Vespa 랭킹

Vespa 랭킹 (Ranking)

Vespa는 매칭된 도큐먼트를 **랭킹 프로파일(ranking profile)**을 통해 점수화하고 순서를 정해요. 검색 결과의 품질은 필드 매칭뿐 아니라 랭킹 표현식에서 크게 갈리므로, 랭킹 설계를 잘하는 게 중요해요.

출처: https://docs.vespa.ai/en/ranking.html

매칭과 랭킹의 분리

Vespa 검색은 두 단계로 나뉘어요. 먼저 쿼리 조건에 매칭되는 도큐먼트를 빠르게 후보로 뽑고(matching), 그 후보들을 랭킹 단계에서 정교한 점수로 정렬해요. 이렇게 하면 검색 속도와 품질을 함께 잡을 수 있어요.

랭킹 프로파일

rank-profile을 스키마에 정의하고, first-phasesecond-phase 표현식을 지정해요. first-phase는 모든 후보에 빠르게 적용하고, second-phase는 상위 후보에만 더 비싼 표현식을 적용해요.

schema doc {
  document doc {
    field title type string { indexing: index | summary }
    field popularity type int { indexing: attribute | summary }
  }

  rank-profile my_ranking inherits default {
    first-phase {
      expression: bm25(title) + attribute(popularity)
    }
  }
}

쿼리에 ranking=my_ranking을 지정하면 이 프로파일을 사용해요.

랭킹 표현식

랭킹 표현식은 랭킹 기능(ranking feature)을 조합해 만들어요. 대표적인 기능은 다음과 같아요.

  • bm25(field) – BM25 점수
  • attribute(field) – 속성값
  • match(field) – 매칭 정도
  • fieldLength(field) / fieldMatch(field) – 매칭 품질
  • embedding(query, field) – 임베딩 유사도

이들을 더하고 곱하고 비중을 줘서 최종 점수를 설계해요.

더 알아보기