ハイブリッド検索とは、同じまたは類似のクエリ条件に対して異なる検索方法や検索クエリを集約することです。この手法では、アルゴリズムを使用して結果をランク付けし、さまざまな検索方法から統合された結果を返します。ハイブリッド検索を実行するには、 $rankFusionを使用します。
因果ランク統合とは
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 結果内のドキュメントのランク付けスコアと重み付けスコアを組み合わせます。
すべての検索結果にわたるドキュメントごとに、ドキュメントの単一のスコアに対して計算された逆数ランクを追加します。
結果内のドキュメントの合計スコアで結果を並べ替えます。
結果内のドキュメントの単一の組み合わせたランク付けリストの結果全体の合計スコアに基づいて、結果内のドキュメントをソートします。
さまざまなハイブリッド検索のユースケースについて
MongoDB ベクトル検索を活用して、さまざまなタイプのハイブリッド検索を実行できます。具体的には、 MongoDB ベクトル検索 は次のユースケースをサポートします。
1 つのクエリで全文検索とベクトル検索: セマンティック検索や全文検索などのさまざまな検索方法からの結果を組み合わせることができます。
$vectorSearchセマンティック検索にはを使用し、$search全文検索結果にはを使用し、レプリカセット ランク統合手法を使用して結果を結合できます。詳細については、 「 MongoDB ベクトル検索とMongoDB Search を使用してハイブリッド検索を実行するsample_mflix.embedded_movies」チュートリアルを参照してください。このチュートリアルでは、 名前空間に対してセマンティック検索と全文検索を実行し、逆数ランク統合を使用して組み合わせてランク付けされた結果を取得する方法を示します。あるいは、結果の相対的な順序付けに加えてスコアが重要になる、より粒度の高いハイブリッド検索には、
$scoreFusionパイプラインステージを使用できます。詳細については、 「 MongoDB ベクトル検索とMongoDB Search を使用してハイブリッド検索を実行するsample_mflix.embedded_movies」チュートリアルを参照してください。このチュートリアルでは、 名前空間に対してセマンティック検索と全文検索を実行し、入力パイプラインの結果を最終スコア付き結果セットに検索する方法を示します。$rankFusionは、入力パイプライン内の位置(相対ランク)に基づいてドキュメントをアルゴリズム付けするのに対し、$scoreFusionは入力パイプラインによって割り当てられたスコアに基づいて、結果を組み合わせるために数学式を使用してドキュメントをランク付けします。$rankFusionでは、ランキングはパイプラインの重みに影響されます。$scoreFusionでは、重みは最終結果への各パイプラインのスコアの貢献を制御します。1 つのクエリ内での複数のベクトル検索クエリ: MongoDB
$rankFusionパイプラインは、同じコレクションに対して実行され、その結果をreciprocal rank fusionによって結合するベクトル検索クエリを含んだ複数のサブパイプラインをサポートしています。「複数の$vectorSearchクエリを組み合わせる方法」チュートリアルでは、次のタイプのベクトル検索について解説します。同じクエリ内でセマンティックが類似した用語をデータセット全体で包括的に検索する
データセット内の複数のフィールドを検索し、どのフィールドがクエリに対して最適な結果を返すかを判断する
異なる埋め込みモデルの埋め込みを使用して検索し、各モデルのセマンティックな解釈の差異を特定する
Considerations
ハイブリッド検索に $rankFusion または $scoreFusion のパイプラインステージを使用する場合は、次の点を考慮してください。
不連続な結果セット
1つの検索方法で捉えられなかった偽陰性を捕捉する際は、個々のサブパイプラインからの結果が不連続であっても許容可能な場合があります。不連続な結果が出た場合、結果のほとんどまたはすべてが一方のパイプラインから返され、もう一方のパイプラインからは返されないように見えることがあります。ただし、すべてのサブパイプラインが同様の結果を返すようにしたい場合は、サブパイプラインごとの結果数を増やしてみてください。
重み付け
各クエリの結果の関連性を高めるために、すべてのクエリに静的な重みを設定するのではなく、レキシカルクエリとベクトルクエリをクエリごとに重み付けすることをお勧めします。これにより、リソースを最も必要とするクエリに割り当てることで、計算リソースの利用効率が向上します。
複数のパイプライン
$rankFusion または $scoreFusion ステージでは任意の数のサブパイプラインを組み合わせることができますが、これらはすべて同じコレクションに対して実行する必要があります 。$rankFusion または $scoreFusion ステージを使用してコレクション全体を検索することはできません。クロスコレクション検索には、$unionWith $vectorSearchとともに ステージを使用します。
非検索パイプライン
検索パイプラインを必要とすることなくコレクション内の特定のフィールドをブーストするには、パイプライン内で$match、$sortなどを使用することが推奨されます。
地理空間関連性
内で $geoNearと$search near 演算子を使用して、$rankFusion または$scoreFusion ステージ内で地理的ロケーションを検索できます。ただし、$geoNear と near 演算子は使用する座標参照フレームが異なります。そのため、結果の序数とスコアは同一ではない可能性があります。
結果を制限する
各サブパイプラインに返される結果の数に制限を設定することをお勧めします。
高度な事前フィルター
ファジー検索、フレーズ一致、ロケーション フィルタリング、ワイルドカード パターン一致などの分析テキスト機能を含む$search 演算子を使用してベクトル検索のデータを事前にフィルタリングする場合は、vectorSearch ( MongoDB Search 演算子)を使用することをお勧めします。 。
制限
$rankFusion と $scoreFusion を使用するハイブリッド検索には次の制限が適用されます。
$rankFusionはMongoDB 8.0 以降(自動アップグレード付きの最新バージョンを含む)でのみサポートされています。注意
8.0.X バージョンで
$rankFusionを使用するには、サポートケースを開く必要があります。8.0 からアップグレードする場合、$rankFusionクエリの実行を一時停止する必要がある場合があります。$rankFusionおよび$scoreFusionサブパイプラインには、次のステージのみを含めることができます。$rankFusionと$scoreFusionは、各サブパイプラインの元の入力ドキュメントへの追跡可能なリンクを保持します。したがって、以下はサポートされていません。$projectステージstoredSourceフィールド
$rankFusionサブパイプラインと$scoreFusionサブパイプラインは、並列ではなく連続して実行されます。$rankFusionと$scoreFusionはページ分割をサポートしていません。rankFusionは、 MongoDB8.0 以上を実行中クラスターのビューでのみ実行できます。ビュー定義 内または時系列コレクションでrankFusionを実行することはできません。
前提条件
これらのチュートリアルを試すには、以下のものが必要です。
MongoDBバージョン v8.0 以降のクラスター。
sample_mflixデータベースがクラスターにロードされました。
mongoshクラスターでクエリを試す注意
また、Atlas CLI を使用して作成したローカル Atlas 配置や、自己管理型(オンプレミス)配置で、これらのハイブリッド検索のユースケースを試すこともできます。詳細については、「Atlas 配置のローカル配置の作成」を参照してください。