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

ベクトル検索近似最近傍探索および厳密最近傍探索クエリの実行

MongoDB ベクトル検索クエリは、 を最初のステージとして使用する集計パイプラインの形式をとります。このページでは、 $vectorSearchステージの構文、オプション、および動作について説明します。$vectorSearch

$vectorSearch

$vectorSearchステージは、次のフィールドを持つドキュメントを取得します。

$vectorSearch ステージを定義する場合、exactフィールドを使用して ANN 検索または SN 検索のどちらを実行するかを指定できます。

近似近傍(近似最近傍探索)検索

近似最近傍探索(ANN)では、MongoDB ベクトル検索は、多次元空間内での近接性と考慮する近傍の数に基づいて、クエリ内のベクトル埋め込みに最も近いデータ内のベクトル埋め込みを検索します。これは Hierarchical Navigable Small Worldsアルゴリズムを使用し、すべてのベクトルをスキャンすることなく、クエリ内のベクトル埋め込みに最も類似するベクトル埋め込みを見つけます。したがって、近似最近傍探索検索は、重要なフィルターなしで大規模なデータセットをクエリするのに最適です。

注意

ANN 検索の最適な呼び出しは、通常、enn 検索との結果の重複が約 90-95% あたりであると考えられますが、レイテンシは大幅に低くなります 。これにより、精度とパフォーマンスの適切なバランスが実現できます。 MongoDB ベクトル検索でこれを実現するには、クエリ時に numCandidates パラメータを調整します。

近似最近傍探索を検索するには、numCandidatesフィールドを指定する必要があります。このフィールドは、MongoDB ベクトル検索が検索する際に考慮する最近傍の数を決定します。

Hierarchical Navigable Small Worldsインデックス構造を使用してベクトル検索を実行すると、 MongoDB ベクトル検索 は優先順位キューを入力して結果を蓄積します。numCandidates パラメーターはこのキューのサイズを制御し、上位のlimit 結果を返すまでの検索時間を決定します。キューが大きいほど(numCandidates より大きい)、検索は Hierarchical Navigable Small Worldsグラフ をより多く調査でき、 クエリレイテンシが増加する可能性をコストにして、より優れた一致を見つける可能性があります。

We recommend that you specify a numCandidates number at least 20 times higher than the number of documents to return (limit) to increase accuracy and reduce discrepancies between your ENN and ANN query results. For example, if you set limit to return 5 results, consider setting numCandidates to 100 as a starting point. To learn more, see How to Measure the Accuracy of Your Query Results.

このオーバーリクエスト パターンは、ANN 検索でレイテンシと再現率のトレードオフを行う推奨方法です。ただし、特定のデータセット サイズとクエリ要件に基づいて、numCandidates パラメータを調整することをお勧めします。正確な結果が得られるようにするには、次の変数を考慮してください。

完全厳密最近傍探索

厳密最近傍探索の場合、MongoDB ベクトル検索は、すべての埋め込み間の距離を計算してすべてのインデックスが付けられたベクトル埋め込みを網羅的に検索し、クエリ内のベクトル埋め込みに対して厳密最近傍探索を見つけます。これは計算負荷が高く、 クエリレイテンシに悪影響を影響可能性があります。したがって、次のユースケースには 厳密最近傍探索 が推奨されます。

$vectorSearch は、それが表示されるすべてのパイプラインの最初のステージである必要があります。

$vectorSearchは、ビュー定義および次のパイプラインステージでは使用できません。

[1] $vectorSearchの結果をこのステージに渡すことができます。

これらのMongoDB ベクトル検索フィールドタイプの詳細については、「 ベクトル検索のフィールドにインデックスを作成する方法 」を参照してください。

MongoDB ベクトル検索 は、返されるすべてのドキュメントに、0 から 1 までの固定範囲のスコアを割り当てます(0 は類似性が低く、1 は類似性が高いことを示します)。

注意

データを事前にフィルタリングしても、 MongoDB ベクトル検索 が クエリにvectorSearchScore $vectorSearchを使用して返すスコアには影響しません。

MongoDB ベクトル検索はデータのフィルターをサポートします。次の作業が可能です。

Atlas Vector Search 事前フィルターおよび事後フィルター

MongoDB ベクトル検索は、データのセグメントに対してプレフィルター操作と書き込みフィルター操作を独立して実行します。各セグメントの HNSW グラフは、そのセグメント内のベクトルのみに基づいています。MongoDB ベクトル検索は、フィルター条件を満たさないドキュメントを除外するために、各セグメントのドキュメントにフィルターを適用します。プレフィルターにより、MongoDB ベクトル検索が HNSW グラフをトラバースする前にドキュメントが除外され、書き込みフィルターにより、ドキュメント内の関連のないドキュメントまたはフィールドがベクトル検索結果から除外されます。

データを事前フィルターすることで、セマンティック検索の範囲を絞り込み、比較対象として関連するベクトルのみが考慮されるようにできます。filter オプションを使用してデータを事前フィルターすると、MongoDBベクトル検索はデータのサブセットのみでセマンティック検索を実行し、検索結果の精度が向上します。

プレフィルターは制限が厳しすぎる可能性があります。プレフィルターはプレフィルターと正確に一致しないデータを除外する可能性がありますが、そのデータはベクトル検索中に考慮するクエリと意味的に類似しています。これを軽減するには、広範なフィルター条件を設定して、クエリが次のことを実行するようにすることをお勧めします。

  • 可能な限り多くの関連する結果が含まれます。

  • 結果から関係のないデータを除外します。

  • 結果におけるリクエストされた数のドキュメントを返します。

重要

フィルターされたクエリは通常、同等のフィルターされていないクエリよりも遅くなります。

インデックスのサイズが事前フィルタリングに最適でない場合、または広範な事前フィルタリング条件を設定している場合は、ベクトル検索結果を後フィルタリングして、関連データのみを返すことができます。ベクトル検索の結果をフィルタリングするには、 ステージの後に $match$vectorSearchステージなどのサポートされている集計パイプラインステージ を使用できます。詳細については、「 その他のパフォーマンスに関する推奨事項 」を参照してください。

$project結果で返すフィールドを選択するには、結果内にすべてのフィールドが必要な場合を除き、 ステージを使用します。クエリのパフォーマンスを向上させるために、$project ステージでベクトルフィールドを除外することをお勧めします。

例、 ステージを使用して$project を含め、次にvectorSearchScore $matchステージを使用して特定のスコアしきい値のみを返すことができます。

  • MongoDB ベクトル検索 は、$eq の短縮形をサポートしています。短縮形式では、クエリに$eq を指定する必要はありません。

    $eq の付いた次のフィルターを例に挙げます。

    "filter": { "_id": { "$eq": ObjectId("5a9427648b0beebeb69537a5") }

    これは、$eq の短縮形を使用する次のフィルターと同等です。

    "filter": { "_id": ObjectId("5a9427648b0beebeb69537a5") }
  • $and MQL演算子を使用して、単一のクエリでフィルターの配列を指定できます。

    たとえば、genres フィールドが Action に等しく、かつ year フィールドの値が 19992000、または 2001 に等しいドキュメントの次のプレフィルターを考えてみましょう。

    "filter": {
    "$and": [
    { "genres": "Action" },
    { "year": { "$in": [ 1999, 2000, 2001 ] } }
    ]
    }
  • ファジー検索、フレーズ一致、ロケーション フィルタリング、ロケーション フィルタリング、その他の分析テキストなどの高度なフィルタリング機能については、 ステージで vectorSearch $search演算子を使用します。

これらの例を実行する前に、次のアクションを実行する必要があります。

次のチュートリアルでは、$vectorSearch ステージのその他のユースケースを示します。