MongoDB ベクトル検索クエリは、 を最初のステージとして使用する集計パイプラインの形式をとります。このページでは、 $vectorSearchステージの構文、オプション、および動作について説明します。$vectorSearch
サポートされているクライアント
構文
フィールド
$vectorSearchステージは、次のフィールドを持つドキュメントを取得します。
ベクトル検索のタイプ
$vectorSearch ステージを定義する場合、exactフィールドを使用して ANN 検索または SN 検索のどちらを実行するかを指定できます。
近似最近傍探索(ANN)では、MongoDB ベクトル検索は、多次元空間内での近接性と考慮する近傍の数に基づいて、クエリ内のベクトル埋め込みに最も近いデータ内のベクトル埋め込みを検索します。これは Hierarchical Navigable Small Worldsアルゴリズムを使用し、すべてのベクトルをスキャンすることなく、クエリ内のベクトル埋め込みに最も類似するベクトル埋め込みを見つけます。したがって、近似最近傍探索検索は、重要なフィルターなしで大規模なデータセットをクエリするのに最適です。
注意
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 パラメータを調整することをお勧めします。正確な結果が得られるようにするには、次の変数を考慮してください。
Considerations
$vectorSearch は、それが表示されるすべてのパイプラインの最初のステージである必要があります。
制限
$vectorSearchは、ビュー定義および次のパイプラインステージでは使用できません。
$facetパイプライン ステージ
| [1] | $vectorSearchの結果をこのステージに渡すことができます。 |
MongoDB ベクトル検索 インデックスの作成
これらのMongoDB ベクトル検索フィールドタイプの詳細については、「 ベクトル検索のフィールドにインデックスを作成する方法 」を参照してください。
MongoDB ベクトル検索 Score
MongoDB ベクトル検索 は、返されるすべてのドキュメントに、0 から 1 までの固定範囲のスコアを割り当てます(0 は類似性が低く、1 は類似性が高いことを示します)。
注意
データを事前にフィルタリングしても、 MongoDB ベクトル検索 が クエリにvectorSearchScore $vectorSearchを使用して返すスコアには影響しません。
MongoDB ベクトル検索フィルター
MongoDB ベクトル検索はデータのフィルターをサポートします。次の作業が可能です。
およびサポートされているその他の集計パイプラインステージを使用して、
$matchMongoDB ベクトル検索クエリの結果を後処理します。

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") } $andMQL演算子を使用して、単一のクエリでフィルターの配列を指定できます。たとえば、
genresフィールドがActionに等しく、かつyearフィールドの値が1999、2000、または2001に等しいドキュメントの次のプレフィルターを考えてみましょう。"filter": { "$and": [ { "genres": "Action" }, { "year": { "$in": [ 1999, 2000, 2001 ] } } ] } ファジー検索、フレーズ一致、ロケーション フィルタリング、ロケーション フィルタリング、その他の分析テキストなどの高度なフィルタリング機能については、 ステージで vectorSearch
$search演算子を使用します。
例
前提条件
これらの例を実行する前に、次のアクションを実行する必要があります。
クエリで使用されるサンプルデータセット をクラスターに追加します。
コレクションの MongoDB ベクトル検索インデックスを作成します。手順については、MongoDB ベクトル検索インデックスの作成手順を参照し、希望する言語のサンプル クエリに合わせてインデックスを構成します。
クエリ
詳細
次のチュートリアルでは、$vectorSearch ステージのその他のユースケースを示します。