ハイブリッド検索とは、同じまたは類似のクエリ条件に対して異なる検索方法や検索クエリを集計することです。この手法では、アルゴリズムを使用して結果をランク付けし、検索の様々な方法から統合された結果を返します。$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などを使用することをお勧めします。
地理空間関連性
$rankFusionまたは$scoreFusion ステージ内で地理的ロケーションを検索するには、$geoNear、およびnear演算子を$search内で使用できます。ただし、$geoNear と near 演算子は使用する座標参照フレームが異なります。そのため、結果の序数とスコアは同一ではない可能性があります。
結果を制限する
MongoDB では、各サブパイプラインに返される結果の数に制限を設定することをお勧めします。$rankFusion または $scoreFusion 入力パイプライン内のパイプラインステージが結果数の制限をサポートしていない場合($search など)は、入力パイプライン内で後続して $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以降を実行しているクラスターのビューでのみ実行できます。ビュー定義内または時系列コレクションでrankFusionを実行することはできません。
前提条件
これらのチュートリアルを試すには、以下のものが必要です。
MongoDBバージョン v8.0 以降のクラスター。
$scoreFusionを使用するには、クラスターで MongoDB v8.3 以降を実行している必要があります。注意
自動埋め込みの場合、クラスターのオートスケーリングは次の設定で有効にする必要があります。
現在のクラスター階層が
M10またはM20(バースト可能な CPU インスタンス)の場合は、最大インスタンスサイズをM30以上に設定します。現在のクラスター階層が
M30以上の場合は、最大インスタンスサイズを現在の階層よりも大きい階層に設定します。NVMeストレージを使用するクラスターの場合は、「ストレージが低く実行中場合は NVMEクラスター階層を増やす 」オプションを選択します。
無料階層 (
M0) と Flex 階層のクラスターでは、それ以上のアクションは必要ありません。
sample_mflixデータベースがクラスターにロードされました。詳細については、サンプルデータを読み込むを参照してください。mongoshまたはMongoDB Compass を使用して、インデックスを作成し、クラスターでクエリを試行します。注意
また、Atlas CLI を使用して作成したローカル Atlas 配置や、自己管理型(オンプレミス)配置で、これらのハイブリッド検索のユースケースを試すこともできます。詳細については、「Atlas 配置のローカル配置の作成」を参照してください。