하이브리드 검색은 동일하거나 유사한 쿼리 기준에 대해 서로 다른 검색 방식 또는 검색 쿼리를 결합한 것입니다. 이 기법은 알고리즘을 사용하여 결과의 순위를 매겨 다양한 검색 방식의 결과를 통합하여 반환합니다. $rankFusion 와 $scoreFusion 을(를) 사용하여 하이브리드 검색을 수행할 수 있습니다.
상호 순위 결합 소개
상호 순위 융합은 서로 다른 검색 방법의 결과를 다음 작업을 통해 단일 결과 집합으로 결합하는 기술입니다.
결과에서 문서의 상호 순위를 계산합니다.
각 검색 결과에서 순위가 매겨진 각 문서에 대해 먼저 그 문서의 순위(
r)에 상수60을 더합니다. 이때 상수는 점수 평활화를 위한 값(rank_constant)입니다. 그리고r과rank_constant의 합으로1을 나누님니다. 이렇게 계산하여 결과 내 해당 문서의 역순위 값을 구합니다.rank_constant의 값을 설정할 수 없으며 기본값은60입니다.reciprocal_rank = 1 / ( r + rank_constant ) 각 검색 방법에 대해 서로 다른 가중치(
w)를 적용하여 해당 검색 방법에 더 많은 중요성을 부여합니다. 각 문서에 대해 가중치가 적용된 상호 순위는 가중치에 문서의 상호 순위를 곱하여 계산됩니다.weighted_reciprocal_rank = w x reciprocal_rank 결과에서 문서의 순위 도출 점수 및 가중치 점수를 결합합니다.
모든 검색 결과의 각 문서에 해당 문서의 단일 점수에 대해 계산된 상호 순위를 추가합니다.
결과에 있는 문서의 합산 점수를 기준으로 결과를 정렬합니다.
결과 내 문서를 단일, 통합된 순위 목록으로 정렬하기 위해 결과 전반에 걸쳐 결합된 점수를 기준으로 문서를 정렬합니다.
상대 점수 합치란 무엇입니까?
상대 점수 융합은 문서의 순위 위치보다는 각 파이프라인의 실제 유용성 점수를 사용하여 서로 다른 검색 방법의 결과를 단일 결과 집합으로 결합하는 기술입니다. 이를 통해 서로 다른 검색 방법의 점수가 정규화, 가중치 부여 및 병합되는 방법을 세부적으로 제어할 수 있습니다. $scoreFusion 를 사용하여 상대 점수 융합을 통해 하이브리드 검색을 수행할 수 있습니다.
상대 점수 합치는 다음 조치를 수행하여 결과를 결합합니다.
- 각 파이프라인의 점수를 정규화합니다.
각 파이프라인의 결과의 각 문서에 대해 정규화 매개변수를 사용하여 원시 점수를 공통 확장으로 정규화합니다. 검색 방법에 따라 점수 확장이 상당히 다르다. 예를 들어 벡터 검색 점수는 일반적으로
0에서1사이이지만, 전체 텍스트 BM25 점수는 훨씬 높은 범위에 있을 수 있습니다. 정규화는 다른 파이프라인의 점수를 결합하기 전에 비교 가능한 확장으로 가져옵니다. 세 가지 정규화 방법이 지원됩니다.none— 점수는 정규화 없이 그대로 결합됩니다. 모든 파이프라인이 이미 비교 가능한 확장에 대해 점수를 생성하는 경우 사용합니다.sigmoid— 결과 세트의 다른 점수 분포를 고려하지 않고 각 점수에 시그모이드 함수를 적용하여 점수를 범위(0, 1)로 매핑합니다.normalized_score = 1 / (1 + e⁻ˢ) minMaxScaler— 결과 세트에서 관찰된 최소 및 최대 점수를 사용하여 최소-최대 확장을 적용하고 최하 점수를0에, 최대 점수를1에 매핑합니다.normalized_score = (s - min_s) / (max_s - min_s)
- 각 파이프라인의 정규화된 점수에 가중치를 적용합니다.
각 파이프라인에 대해 각 문서의 정규화된 점수에 파이프라인의 가중치
w를 곱합니다. 가중치를 지정하지 않으면 기본값은1입니다. 가중치를 사용하여 특정 검색 방법에 다른 검색 방법보다 더 많은 중요성을 부여할 수 있습니다.weighted_score = w x normalized_score - 각 문서의 가중치를 결합합니다.
- 모든 검색 결과에 걸쳐 나타나는 각 문서에 대해 해당 문서가 나타난 모든 파이프라인에서 가중치를 결합합니다. 기본값 결합 방법은 가중치를 평균하는
avg입니다. 표현식을 사용하여 사용자 지정 결합 노리를 정의합니다. - 합산 점수를 기준으로 결과를 정렬합니다.
- 모든 파이프라인에 걸쳐 결합된 점수를 기준으로 결과의 모든 문서를 정렬하여 단일의 통합된 순위 목록을 생성합니다.
다양한 하이브리드 검색 사용 사례
MongoDB 벡터 검색을 사용하여 여러 유형의 하이브리드 검색을 수행할 수 있습니다. 구체적으로 MongoDB 벡터 검색은 다음 사용 사례를 지원합니다.
단일 쿼리에서 전체 텍스트 검색과 벡터 검색 결합: 시맨틱 검색과 전체 텍스트 검색과 같은 서로 다른 검색 방법의 결과를 결합할 수 있습니다. 시맨틱 검색에는
$vectorSearch를, 전체 텍스트 검색 결과에는$search을 사용하여 결과를 구한 뒤 상호 순위 융합 기법으로 결과를 통합할 수 있습니다. 자세한 내용은sample_mflix.embedded_movies네임스페이스에 대해 시맨틱 검색과 전체 텍스트 검색을 수행하고 상호 순위 융합을 사용하여 결합된 순위 결과를 조회하는 방법을 보여주는 하이브리드 벡터 및 전체 텍스트 검색 수행 튜토리얼을 참조하세요.또는 결과의 상대적 순서 외에도 점수가 중요한 더 세분화된 하이브리드 검색의 경우
$scoreFusion파이프라인 단계를 사용할 수 있습니다. 자세한 학습은 하이브리드 벡터 및 전체 텍스트 검색 수행 튜토리얼을 참조하세요. 이 튜토리얼에서는sample_mflix.embedded_movies네임스페이스에 대해 시맨틱 검색 및 전체 텍스트 검색을 수행하고 입력 파이프라인 결과를 최종 점수 결과 설정으로 조회하는 방법을 보여줍니다.$rankFusion는 상호 순위 통합 알고리즘 사용하여 입력 파이프라인에서 위치(상대적 순위)에 따라 문서의 순위를 매기는 반면,$scoreFusion는 결과를 결합하는 수학적 표현식을 사용하여 입력 파이프라인에서 할당한 점수를 기준으로 문서의 순위를 매깁니다.$rankFusion에서 순위는 파이프라인 가중치의 영향을 받습니다.$scoreFusion에서 가중치는 최종 결과에 대한 각 파이프라인 점수의 기여도를 제어합니다.또한 쿼리의 유인성에 따라 결과의 문서 순서를 재조정하려면
$rankFusion또는$scoreFusion단계 다음에$rerank단계를 사용할 수 있습니다. 자세히 알아보려면$rerank집계 파이프라인 단계를 참조하세요.단일 쿼리에서 여러 벡터 검색 쿼리 실행: MongoDB
$rankFusion파이프라인은 동일한 컬렉션에 대해 실행되는 벡터 검색 쿼리를 포함한 여러 하위 파이프라인을 지원하며 상호 순위 융합 기법으로 결과를 통합합니다. 여러$vectorSearch쿼리를 결합하는 방법 튜토리얼에서는 다음과 같은 유형의 벡터 검색을 다룹니다.동일한 쿼리 내에서 의미상 유사한 텀을 데이터셋 전체에 걸쳐 포괄적으로 검색합니다.
데이터셋 내 여러 필드를 검색하여, 쿼리에 가장 적합한 결과를 반환하는 필드를 확인할 수 있습니다.
서로 다른 임베딩 모델에서 생성된 임베딩을 사용하여 검색하고, 각 모델 간의 의미 해석 차이를 확인할 수 있습니다.
고려 사항
하이브리드 검색 에 $rankFusion 또는 $scoreFusion 파이프라인 단계를 사용하는 경우 다음 사항을 고려하세요.
분리된 결과 집합
하나의 검색 방식이 놓친 오탐을 포착하려면 개별 하위 파이프라인에서 분리된 결과를 사용하는 것이 바람직할 수도 있습니다. 결과가 분리된 경우 대부분 또는 모든 결과가 하나의 파이프라인에서 반환된 것처럼 보일 수 있으며, 다른 파이프라인에서는 반환되지 않을 수 있습니다. 그러나 모든 하위 파이프라인이 유사한 결과를 반환하게 하려면 하위 파이프라인당 결과 수를 늘려 보세요.
가중치
MongoDB는 모든 쿼리에 대해 정적 가중치를 사용하는 대신 쿼리별로 텍스트 및 벡터 쿼리에 가중치를 두는 것을 권장합니다. 이렇게 하면 각 쿼리에 대한 결과의 관련성을 향상시킬 수 있습니다. 이렇게 하면 가장 많은 자원이 필요한 쿼리에 리소스를 할당할 수 있어 계산 리소스 활용도 향상됩니다.
여러 집계 파이프라인
$rankFusion 또는 $scoreFusion 단계에서 임의의 수의 하위 파이프라인을 결합할 수 있지만 이들은 모두 동일한 컬렉션에 대해 실행되어야 합니다. $rankFusion 또는 $scoreFusion 단계를 사용하여 컬렉션 간 검색을 수행할 수 없습니다. 컬렉션 간 검색을 위해 $unionWith 단계와 $vectorSearch 단계를 함께 사용하세요.
비검색 파이프라인
MongoDB는 별도의 검색 파이프라인 없이도 컬렉션 내 특정 필드를 강화하려면 파이프라인에서 $match, $sort 등을 사용하는 것을 권장합니다.
지리적 관련성
$rankFusion 또는 $scoreFusion 단계 내에서 지리적 위치 검색을 위해 $geoNear 및 near 연산자를 $search 내에서 사용할 수 있습니다. 그러나 $geoNear 와 근거리 연산자 서로 다른 좌표 참조 프레임을 사용합니다. 따라서 결과 서수와 점수가 동일하지 않을 수 있습니다.
결과 제한
MongoDB는 각 하위 파이프라인에 대해 반환할 결과 수에 제한을 설정하는 것이 좋습니다. $rankFusion 또는 $scoreFusion 입력 파이프라인 내부의 파이프라인 단계에서 결과 수 제한(예: $search)을 지원하지 않는 경우 MongoDB는 입력 파이프라인 내부에서 이후에 $limit 를 사용하여 $rankFusion 또는 $scoreFusion 가 평가하는 문서 수를 제한하는 것이 좋습니다.
고급 사전 필터
퍼지 검색, 구문 일치, 위치 필터링, 와일드카드 패턴 일치 등과 같은 분석된 텍스트 기능을 포함하는 $search 연산자를 사용하여 벡터 검색용 데이터를 사전 필터링하려면 vectorSearch (MongoDB Search 연산자) 를 사용하는 것이 좋습니다.
제한 사항
$rankFusion 및 $scoreFusion를 사용하는 하이브리드 검색 에는 다음과 같은 제한 사항이 적용 .
$rankFusionMongoDB 8.0 이상에서만 지원됩니다(자동 업그레이드가 포함된 최신 버전 포함).$scoreFusion는 v8.3 이상에서 사용할 수 있습니다.참고
$scoreFusion을 사용하려면 클러스터가 MongoDB v8.3 이상을 실행해야 합니다. 8.0에서 업그레이드할 경우$rankFusion쿼리 실행을 일시 중지해야 할 수 있습니다.$rankFusion및$scoreFusion하위 파이프라인에는 다음 단계만 포함될 수 있습니다.$rankFusion그리고$scoreFusion는 각 하위 파이프라인에 대해 원본 입력 문서로 돌아가 추적할 수 있는 링크를 유지합니다. 따라서 다음을 지원하지 않습니다.$project단계storedSource 필드
$rankFusion및$scoreFusion하위 파이프라인이 병렬이 아닌 직렬로 실행 .$rankFusion및$scoreFusion은(는) 페이지 지원 하지 않습니다.rankFusionMongoDB 8.0 이상을 실행하는 클러스터에서만 보기 에서 실행할 수 있습니다. 보기 정의 내에서나 time series 컬렉션에서rankFusion를 실행할 수 없습니다.
전제 조건
이 튜토리얼을 시도하려면 다음이 필요합니다.
MongoDB 버전 v8.0 이상을 사용하는 클러스터.
$scoreFusion를 사용하려면 클러스터에서 MongoDB v8.3 이상을 실행해야 합니다.참고
자동 임베딩을 위해 클러스터 자동 확장은 다음 설정으로 활성화되어야 합니다.
현재 클러스터 계층이
M10또는M20(버스트 가능 CPU 인스턴스)인 경우 최대 인스턴스 크기를M30이상으로 설정합니다.현재 클러스터 계층이
M30이상인 경우 최대 인스턴스 크기를 현재 계층보다 큰 계층으로 설정합니다.NVMe 스토리지 사용하는 클러스터의 경우 저장 실행 시 NVME 클러스터 계층 확장 옵션을 선택합니다.
무료(
M0) 및 Flex 계층 클러스터의 경우 추가 조치는 필요하지 않습니다.
프로젝트 에 대한
Project Data Access Admin액세스 으로 MongoDB 벡터 검색 및 MongoDB Search 인덱스를 생성할 수 있습니다.클러스터 에 로드된
sample_mflix데이터베이스 . 자세한 학습은 샘플 데이터 로드를 참조하세요.mongosh또는 MongoDB Compass 사용하여 인덱스를 생성하고 클러스터 에서 쿼리를 시도할 수 있습니다.참고
Atlas CLI 사용하여 생성한 로컬 Atlas 배포 및 자체 관리( 온프레미스 ) 배포에서 이러한 하이브리드 검색 사용 사례를 시도할 수도 있습니다. 자세히 학습 로컬 Atlas 배포 만들기를 참조하세요.