AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

ハイブリッドAtlas Searchの実行方法

ハイブリッド検索とは、同じまたは類似のクエリ条件に対して異なる検索方法や検索クエリを集計することです。この手法では、アルゴリズムを使用して結果をランク付けし、検索の様々な方法から統合された結果を返します。$rankFusion$scoreFusion を使用してハイブリッド検索を実行できます。

Reciprocal Rank Fusion(RRF)は、次のアクションを実行して、さまざまな検索方法の結果を1つの結果セットにまとめる手法です。

  1. 結果内のドキュメントの逆ランクを計算します。

    各検索結果内のランク付けされたドキュメントごとに、まずドキュメントの順位(r)に定数 60 を加えてスコア(rank_constant)を平滑化し、次に 1rrank_constant の合計で割って、結果内のドキュメントの逆数順位を求めます。rank_constant の値は自分で設定することはできず、デフォルトの 60 になっています。

    reciprocal_rank = 1 / ( r + rank_constant )

    各検索方法に異なる重み( w )を適用して、その検索方法の重要性を高めます。 各ドキュメントについて、重みをドキュメントの逆数ランクで乗算して重みを含む、重み付きランクを計算します。

    weighted_reciprocal_rank = w x reciprocal_rank
  2. 結果内のドキュメントのランク付けスコアと重み付けスコアを組み合わせます。

    すべての検索結果にわたるドキュメントごとに、ドキュメントの単一のスコアに対して計算された逆数ランクを追加します。

  3. 結果内のドキュメントの合計スコアで結果を並べ替えます。

    結果内のドキュメントの単一の組み合わせたランク付けリストの結果全体の合計スコアに基づいて、結果内のドキュメントをソートします。

相対スコアフュージョンは、ドキュメントのランク位置ではなく、各パイプラインの実際の関連度スコアを使用して、様々な検索方法の結果を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クエリを組み合わせる方法」チュートリアルでは、次のタイプのベクトル検索について解説します。

    • 同じクエリ内でセマンティックが類似した用語をデータセット全体で包括的に検索する

    • データセット内の複数のフィールドを検索し、どのフィールドがクエリに対して最適な結果を返すかを判断する

    • 異なる埋め込みモデルの埋め込みを使用して検索し、各モデルのセマンティックな解釈の差異を特定する

ハイブリッド検索に $rankFusion または $scoreFusion のパイプラインステージを使用する場合は、次の点を考慮してください。

1つの検索方法で捕捉できなかった偽陰性を捕捉する場合は、個々のサブパイプラインからの結果が不連続であっても問題ない場合があります。結果が不連続である場合、結果のほとんどまたはすべてが一方のパイプラインから返され、もう一方のパイプラインからは返されないように見えることがあります。ただし、すべてのサブパイプラインが同様の結果を返すようにしたい場合は、サブパイプラインごとの結果数を増やしてみてください。

MongoDB では、各クエリの結果の関連性を高めるために、すべてのクエリに静的な重みを設定するのではなく、クエリごとにレキシカルクエリとベクトルクエリの重み付けを行うことをお勧めします。これにより、リソースを最も必要とするクエリに割り当てることで、計算リソースの利用率も向上します。

$rankFusion または $scoreFusion ステージで任意の数のサブパイプラインを結合できますが、それらはすべて同じコレクションに対して実行する必要があります。$rankFusion または $scoreFusion ステージを使用してコレクション間で検索することはできません。コレクション間検索には、$unionWith ステージと $vectorSearch を使用します。

MongoDB では、検索パイプラインを必要とすることなくコレクション内の特定のフィールドをブーストするには、パイプライン内で$match$sortなどを使用することをお勧めします。

$rankFusionまたは$scoreFusion ステージ内で地理的ロケーションを検索するには、$geoNear、およびnear演算子を$search内で使用できます。ただし、$geoNearnear 演算子は使用する座標参照フレームが異なります。そのため、結果の序数とスコアは同一ではない可能性があります。

MongoDB では、各サブパイプラインに返される結果の数に制限を設定することをお勧めします。$rankFusion または $scoreFusion 入力パイプライン内のパイプラインステージが結果数の制限をサポートしていない場合($search など)は、入力パイプライン内で後続して $limit を使用して、$rankFusion または $scoreFusion が評価するドキュメントの数を制限することをお勧めします。

ファジー検索、フレーズ一致、ロケーションによるフィルタリング、ワイルドカード パターンマッチングなどの分析テキスト機能を含む$search 演算子を使用してベクトル検索のデータを事前フィルタリングする場合は、 vectorSearch(MongoDB Search 演算子) の使用をお勧めします。

$rankFusion$scoreFusion を使用するハイブリッド検索には次の制限が適用されます。

  • $rankFusion MongoDB 8.0 以降(自動アップグレード付きの最新バージョンを含む)でのみサポートされています。$scoreFusion は v8.3 以降で利用できます。

    注意

    $scoreFusion を使用するには、クラスターで MongoDB v8.3 以降を実行する必要があります。8.0 からアップグレードする場合、$rankFusion クエリの実行を一時停止する必要がある場合があります。

  • $rankFusion および $scoreFusion サブパイプラインには、次のステージのみを含めることができます。

  • $rankFusion また、$scoreFusion は、各サブパイプラインの元の入力ドキュメントへの追跡可能なリンクを保持します。したがって、次の項目はサポートされていません。

  • $rankFusion サブパイプラインと $scoreFusion サブパイプラインは、並列ではなく連続して実行されます。

  • $rankFusion$scoreFusion はページ分けをサポートしていません。

  • rankFusion MongoDB 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 配置のローカル配置の作成」を参照してください。