MongoDB ベクトル検索クエリは、 $vectorSearchを最初のステージとして使用する集計パイプラインの形式をとります。このページでは、$vectorSearch ステージの構文、オプション、および動作について説明します。
サポートされているクライアント
構文
フィールド
$vectorSearchステージは、次のフィールドを持つドキュメントを取得します。
ベクトル検索のタイプ
$vectorSearch ステージを定義する場合、exactフィールドを使用して近似最近傍探索または厳密最近傍探索を実行するかを指定できます。
近似最近傍探索(ANN)では、MongoDB ベクトル検索は、多次元空間内での近接性と考慮する近傍の数に基づいて、クエリ内のベクトル埋め込みに最も近いデータ内のベクトル埋め込みを検索します。これは Hierarchical Navigable Small Worldsアルゴリズムを使用し、すべてのベクトルをスキャンすることなく、クエリ内のベクトル埋め込みに最も類似するベクトル埋め込みを見つけます。したがって、近似最近傍探索検索は、重要なフィルターなしで大規模なデータセットをクエリするのに最適です。
注意
Ann 検索の最適な再現率は通常、enn 検索との結果の重複が約90 95- % であると考えられますが、レイテンシは大幅に低くなります 。これにより、精度とパフォーマンスの適切なバランスが実現できます。MongoDB ベクトル検索でこれを実現するには、クエリ時に 調整 numCandidates パラメータをします。
numCandidates 選択
近似最近傍探索を検索するには、numCandidatesフィールドを指定する必要があります。このフィールドは、MongoDB ベクトル検索が検索する際に考慮する最近傍の数を決定します。
Hierarchical Navigable Small Worldsインデックス構造を使用してベクトル検索を実行すると、 MongoDB ベクトル検索 は優先順位キューを入力して結果を蓄積します。numCandidates パラメーターはこのキューのサイズを制御し、上位のlimit 結果を返すまでに検索する時間を決定します。キューが大きいほど(numCandidates より大きい)、検索は Hierarchical Navigable Small Worldsグラフ をより多く調査でき、 クエリレイテンシが増加する可能性をコストにして、より優れた一致を見つける可能性があります。
精度を高めるために、返されるドキュメント数(limit)の少なくとも 20 倍である numCandidates 数値を指定することをお勧めします。厳密最近傍探索 クエリ結果と 近似最近傍探索 クエリ結果間の不整合を減らします。例、limit を設定すると 5 結果が返される場合は、開始点として numCandidates を 100 に設定することを検討してください。詳しくは、「クエリ結果の精度を測定する方法」を参照してください。
このオーバーリクエスト パターンは、 近似最近傍探索 検索でレイテンシと 再現率 のトレードオフを行う推奨方法です。ただし、特定のデータセット サイズとクエリ要件に基づいて、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 ベクトル検索 はデータのサブセットのみに対してセマンティック検索を実行するため、 MongoDB ベクトル検索クエリで使用される計算リソースが削減され、パフォーマンスが向上します。
事前フィルターは制限がかかりすぎる可能性があり、ベクトル検索中に考慮する必要があるクエリにセマンティックに類似しているデータが事前フィルターにより除外される可能性があるためです。これを軽減するために、クエリが次の動作を行うように、広範なフィルター条件を設定することをお勧めします。
関連する結果ができるだけ多く含まれます。
結果から関連のないデータを除外します。
結果内にリクエストされた数のドキュメントを返します。
重要
フィルターされたクエリは通常、同等のフィルターされていないクエリよりも遅くなります。
フィルタリング後の検索結果
インデックスのサイズが事前フィルタリングに最適でない場合、または広範な事前フィルタリング条件を設定している場合は、ベクトル検索結果を後フィルタリングして、関連データのみを返すことができます。ベクトル検索の結果をフィルタリングするには、 ステージの後に$match$vectorSearch ステージなど、サポートされている任意の集計パイプラインステージ を使用できます。詳細については、「 その他のパフォーマンスに関する推奨事項 」を参照してください。
$project結果で返すフィールドを選択するには、結果内にすべてのフィールドが必要な場合を除き、 ステージを使用します。クエリのパフォーマンスを向上させるには、$project ステージでベクトルフィールドを除外することをお勧めします。
例、 ステージを使用して$project を含め、次にvectorSearchScore $matchステージを使用して特定のスコアしきい値を超えるドキュメントのみを返すことができます。
フィルターに関する考慮事項
MongoDB ベクトル検索 は、
$eqの短縮形をサポートしています。短縮形式では、クエリに$eqを指定する必要はありません。$eqの付いた次のフィルターを例に挙げます。"filter": { "_id": { "$eq": ObjectId("5a9427648b0beebeb69537a5") } これは、
$eqの短縮形を使用する次のフィルターと同等です。"filter": { "_id": ObjectId("5a9427648b0beebeb69537a5") } $andMQL 演算子を使用して、1 回のクエリでフィルターの配列を指定できます。たとえば、
genresフィールドがActionに等しく、かつyearフィールドの値が1999、2000、または2001に等しいドキュメントの次のプレフィルターを考えてみましょう。"filter": { "$and": [ { "genres": "Action" }, { "year": { "$in": [ 1999, 2000, 2001 ] } } ] } ファジー検索、フレーズ一致、ロケーション フィルタリング、ロケーション フィルタリング、その他の分析テキストなどの高度なフィルタリング機能については、vectorSearch 演算子を使用します。
$searchステージで。
例
前提条件
これらの例を実行する前に、次のアクションを実行する必要があります。
クエリで使用されるサンプルデータセット をクラスターに追加します。
コレクションのMongoDB ベクトル検索インデックスを作成します。手順については、MongoDB ベクトル検索インデックスの作成手順を参照し、サンプルクエリの構成を希望言語でコピーします。