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