ハイブリッド検索とは、同じまたは類似のクエリ条件を持つ異なる検索方法または検索クエリを集計です。この手法では、アルゴリズムを使用して結果をランク付けし、さまざまな検索方法から統合された結果が返されます。$rankFusion と$scoreFusion を使用してハイブリッド検索を実行できます。
因果ランク統合とは
Reciprocal Rank Fusion(RRF)は、次のアクションを実行して、さまざまな検索方法の結果を1つの結果セットにまとめる手法です。
結果内のドキュメントの逆ランクを計算します。
各検索結果内のランク付けされたドキュメントごとに、まずドキュメントの順位(
r)に定数60を加えてスコア(rank_constant)を平滑化し、次に1をrとrank_constantの合計で割って、結果内のドキュメントの逆数順位を求めます。rank_constantの値は自分で設定することはできず、デフォルトの60になっています。reciprocal_rank = 1 / ( r + rank_constant ) 各検索方法に異なる重み(
w)を適用して、その検索方法の重要性を高めます。 各ドキュメントについて、重みをドキュメントの逆数ランクで乗算して重みを含む、重み付きランクを計算します。weighted_reciprocal_rank = w x reciprocal_rank 結果内のドキュメントのランク付けスコアと重み付けスコアを組み合わせます。
すべての検索結果にわたるドキュメントごとに、ドキュメントの単一のスコアに対して計算された逆数ランクを追加します。
結果内のドキュメントの合計スコアで結果を並べ替えます。
結果内のドキュメントの単一の組み合わせたランク付けリストの結果全体の合計スコアに基づいて、結果内のドキュメントをソートします。
相対スコアフュージョンとは何ですか?
相対的スコア統合とは、ドキュメントのランク位置ではなく、各パイプラインの実際の関連性スコアを使用して、異なる検索メソッドの結果を 1 つの結果セットに結合する手法です 。これにより、さまざまな取得方法からのスコアが正規化、重み付け、マージされる方法を微調整することができます。$scoreFusion を使用すると、相対的スコア統合を使用してハイブリッド検索を実行できます。
相対スコアの統合は、次のアクションを実行することで結果を統合します。
- 各パイプラインのスコアを正規化します。
各パイプラインの結果に含まれる各ドキュメントについて、normalizationパラメーターを使用して生のスコアを共通のスケールに正規化します。検索手法によってスコアの範囲は大きく異なります。たとえば、ベクトル検索のスコアは通常
0から1の範囲ですが、全文検索であるBM25のスコアはそれよりもはるかに高くなる場合があります。正規化により、異なるパイプラインからのスコアを結合する前に、比較可能なスケールに揃えることができます。3つの正規化方法がサポートされています:none— スコアは、正規化せずにそのまま総合されます。すべてのパイプラインがすでに比較可能なスケールでスコアを生成している場合に使用します。sigmoid— 各スコアにシグモイド関数を適用し、結果セット内の他のスコアの分布を考慮せずにスコアを範囲 (0, 1) にマップします。normalized_score = 1 / (1 + e⁻ˢ) minMaxScaler— 結果セット全体で観測された最低スコアと最高スコアを使用して最小値と最大値の拡大を適用し、最低スコアを0に、最高スコアを1にマッピングします。normalized_score = (s - min_s) / (max_s - min_s)
- 各パイプラインの正規化されたスコアに重みを適用します。
各パイプラインについて、各ドキュメントの正規化されたスコアにパイプラインの重み
wを乗算します。指定しない場合、重みはデフォルトで1になります。重みを使用して、他の検索方法よりも 1 つの検索方法に重要性を持たせます。weighted_score = w x normalized_score - 各ドキュメントの加重スコアを結合します。
- すべての検索結果に表示される各ドキュメントについて、そのドキュメントが表示されたすべてのパイプラインからの重み付きスコアを総合します。デフォルトの組み合わせ方法は
avgで、重み付きスコアの平均を計算します。式を使用してカスタムの組み合わせロジックを定義します。 - 結合されたスコアで結果を並べ替えます。
- すべてのパイプラインでの合計スコアに基づいて結果内のすべてのドキュメントをソートし、単一の統一されたランク付きリストを生成します。
さまざまなハイブリッド検索のユースケースについて
MongoDB ベクトル検索を使用して、いくつかのタイプのハイブリッド検索を実行できます。具体的には、MongoDB ベクトル検索は次のユースケースをサポートしています。
1 つのクエリで全文検索とベクトル検索: セマンティック検索や全文検索などのさまざまな検索方法からの結果を組み合わせることができます。セマンティック検索には
$vectorSearchを使用し、全文検索結果には を使用し、レプリカセット$searchランク統合手法を使用して結果を結合できます。詳細については、「 ハイブリッドベクトルと全文検索の実行 」チュートリアルを参照してください。このチュートリアルでは、sample_mflix.embedded_movies名前空間に対してセマンティック検索と全文検索を実行し、逆数ランク統合を使用してランク付けされた結果を組み合わせて取得する方法を説明します。あるいは、結果の相対的な順序付けに加えてスコアが重要になる、より粒度の高いハイブリッド検索には、
$scoreFusionパイプラインステージを使用できます。詳細については、「ハイブリッドベクトル検索と全文検索の実行」チュートリアルを参照してください。このチュートリアルでは、sample_mflix.embedded_movies名前空間に対してセマンティック検索と全文検索を実行し、入力パイプラインの結果を最終スコア付き結果セットに検索する方法を示します。$rankFusionは、入力パイプライン内の位置(相対ランク)に基づいてドキュメントをアルゴリズム付けするのに対し、$scoreFusionは入力パイプラインによって割り当てられたスコアに基づいて、結果を組み合わせるために数学式を使用してドキュメントをランク付けします。$rankFusionでは、ランキングはパイプラインの重みに影響されます。$scoreFusionでは、重みは最終結果への各パイプラインのスコアの貢献を制御します。さらに、
$rankFusionまたは$scoreFusionステージの後に$rerankステージを使用すると、クエリに対する関連性に基づいて結果内のドキュメントを再配列できます。詳細については、「$rerank集計パイプライン ステージ」を参照してください。1 つのクエリ内での複数のベクトル検索クエリ: MongoDB
$rankFusionパイプラインは、同じコレクションに対して実行され、その結果をreciprocal rank fusionによって結合するベクトル検索クエリを含んだ複数のサブパイプラインをサポートしています。「複数の$vectorSearchクエリを組み合わせる方法」チュートリアルでは、次のタイプのベクトル検索について解説します。同じクエリ内でセマンティックが類似した用語をデータセット全体で包括的に検索する
データセット内の複数のフィールドを検索し、どのフィールドがクエリに対して最適な結果を返すかを判断する
異なる埋め込みモデルの埋め込みを使用して検索し、各モデルのセマンティックな解釈の差異を特定する
Considerations
ハイブリッド検索に $rankFusion または $scoreFusion のパイプラインステージを使用する場合は、次の点を考慮してください。
不連続な結果セット
1つの検索方法で捕捉できなかった偽陰性を捕捉する場合は、個々のサブパイプラインからの結果が不連続であっても問題ない場合があります。結果が不連続である場合、結果のほとんどまたはすべてが一方のパイプラインから返され、もう一方のパイプラインからは返されないように見えることがあります。ただし、すべてのサブパイプラインが同様の結果を返すようにしたい場合は、サブパイプラインごとの結果数を増やしてみてください。
重み付け
MongoDB では、各クエリの結果の関連性を高めるために、すべてのクエリに静的な重みを設定するのではなく、クエリごとにレキシカルクエリとベクトルクエリの重み付けを行うことをお勧めします。これにより、リソースを最も必要とするクエリに割り当てることで、計算リソースの利用率も向上します。
複数のパイプライン
または ステージでは任意の数のサブパイプラインを組み合わせることができますが、これらはすべて同じコレクションに対して実行する必要があります 。$rankFusion または ステージを使用してコレクション全体を検索することはできません。クロスコレクション検索には、$scoreFusion$rankFusion $scoreFusionとともに$unionWith $vectorSearchステージを使用します。
非検索パイプライン
MongoDB、検索パイプラインを必要とせずにコレクション内の特定のフィールドをブーストするために、パイプラインで$match 、$sort などを使用することを推奨しています。
地理空間関連性
$geoNear内では、 $searchと near 演算子を使用して、$rankFusion または$scoreFusion ステージ内で地理的ロケーションを検索できます。ただし、$geoNear と near 演算子は使用する座標参照フレームが異なります。そのため、結果の序数とスコアは同一ではない可能性があります。
結果を制限する
MongoDB、各サブパイプラインに対して返される結果の数に制限を設定することを推奨しています。 $rankFusion または $scoreFusion 入力パイプライン内のパイプラインステージが結果数の制限をサポートしていない場合($search など)、 MongoDBドキュメント数を制限するために、入力パイプライン内で後続の $limit を使用することを推奨します。 $rankFusion または $scoreFusion が評価する
高度なプレフィルター
MongoDB、ファジー検索、フレーズ一致、ロケーション フィルタリング、ワイルドカード パターン一致などの分析テキスト機能を含む $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はページ分けをサポートしていません。
前提条件
これらのチュートリアルを試すには、以下のものが必要です。
MongoDBバージョン v8.0 以降のクラスター。
$scoreFusionを使用するには、クラスターで MongoDB v8.3 以降を実行している必要があります。注意
自動埋め込みの場合、クラスターのオートスケーリングは次の設定で有効にする必要があります。
現在のクラスター階層が
M10またはM20(バースト可能な CPU インスタンス)の場合は、最大インスタンスサイズをM30以上に設定します。現在のクラスター階層が
M30以上の場合は、最大インスタンスサイズを現在の階層よりも大きい階層に設定します。NVMeストレージを使用するクラスターの場合は、「ストレージが低く実行中場合は NVMEクラスター階層を増やす 」オプションを選択します。
無料階層 (
M0) と Flex 階層のクラスターでは、それ以上のアクションは必要ありません。
Project Data Access AdminMongoDB ベクトル検索とMongoDB Search インデックスを作成するためのプロジェクトへの アクセス。sample_mflixデータベースがクラスターにロードされました。詳細については、「 サンプル データのロード 」を参照してください。mongoshまたはMongoDB Compass を使用して、インデックスを作成し、クラスターでクエリを試行します。注意
また、Atlas CLI を使用して作成したローカル Atlas 配置や、自己管理型(オンプレミス)配置で、これらのハイブリッド検索のユースケースを試すこともできます。詳細については、「Atlas 配置のローカル配置の作成」を参照してください。