MongoDB ベクトル検索クエリは、 $vectorSearchを第 1 ステージとして使用する 集計パイプラインの形式をとります。このページでは、 ステージの構文、オプション、および$vectorSearch 動作について説明します。
サポートされているクライアント
構文
フィールド
$vectorSearchステージは、次のフィールドを持つドキュメントを取得します。
ベクトル検索のタイプ
$vectorSearchステージを定義する場合、exact フィールドを使用して SN 検索または ENN 検索のどちらを実行するかを指定できます。
近似最近傍探索(ANN)では、MongoDB ベクトル検索は、多次元空間内での近接性と考慮する近傍の数に基づいて、クエリ内のベクトル埋め込みに最も近いデータ内のベクトル埋め込みを検索します。Hierarchical Navigable Small Worldsアルゴリズムを使用し、すべてのベクトルをスキャンすることなく、クエリ内のベクトル埋め込みに最も類似するベクトル埋め込みを見つけます。したがって、近似最近傍探索は、重要なフィルターなしで大規模なデータセットをクエリするのに最適です。
注意
Ann 検索の最適な再現率は通常、enn 検索との結果の重複が約90 95- % であると考えられますが、レイテンシは大幅に低くなります 。これにより、精度とパフォーマンスの適切なバランスが実現できます。MongoDB ベクトル検索でこれを実現するには、クエリ時に 調整 numCandidates パラメータをします。
numCandidates 選択
近似最近傍探索を検索するには、numCandidatesフィールドを指定する必要があります。このフィールドは、MongoDB ベクトル検索が検索する際に考慮する最近傍の数を決定します。
numCandidates20精度を高めるために、返されるドキュメント数(limit )の少なくとも 倍である 数値を指定することをお勧めします。enn クエリ結果と Ann クエリ結果間の不整合を減らします。例、limit 5numCandidatesを設定すると100 結果が返される場合は、開始点として を に設定することを検討してください。詳しくは、「 クエリ結果の精度を測定する方法 」を参照してください。
このオーバーリクエスト パターンは、 近似最近傍探索 検索でレイテンシと 再現率 のトレードオフを行う推奨方法です。ただし、特定のデータセット サイズとクエリ要件に基づいて、numCandidates パラメータを調整することをお勧めします。正確な結果が得られるようにするには、次の変数を考慮してください。
動作
$vectorSearch は、それが表示されるすべてのパイプラインの最初のステージである必要があります。
制限
$vectorSearchは、ビュー定義と次のパイプライン ステージでは使用できません。
| [1] | このステージには $vectorSearch の結果を渡すことができます。 |
MongoDB ベクトル検索 インデックスの作成
これらのMongoDB ベクトル検索フィールドタイプの詳細については、「 ベクトル検索のフィールドにインデックスを作成する方法 」を参照してください。
MongoDB ベクトル検索 Score
MongoDB ベクトル検索 は、返されるすべてのドキュメントに、0 から 1 までの固定範囲のスコアを割り当てます(0 は類似性が低く、1 は類似性が高いことを示します)。
返される各ドキュメントには、メタデータとしてスコアが含まれます。各ドキュメントのスコアと結果セットを返すには、集計パイプラインで $project ステージを使用し、score をプロジェクトするフィールドとして構成します。scoreフィールドに、値 vectorSearchScore を持つ $meta式を指定します。構文は次のとおりです。
1 db.<collection>.aggregate([ 2 { 3 "$vectorSearch": { 4 <query-syntax> 5 } 6 }, 7 { 8 "$project": { 9 "<field-to-include>": 1, 10 "<field-to-exclude>": 0, 11 "score": { "$meta": "vectorSearchScore" } 12 } 13 } 14 ])
注意
vectorSearchScore を score $meta 式として使用できるのは、$vectorSearch パイプラインステージの後のみです。他のクエリの後に vectorSearchScore を使用すると、 MongoDB はMongoDB v8.2 以降の警告をログに記録します。
注意
データを事前にフィルタリングしても、 MongoDB ベクトル検索 が クエリにvectorSearchScore $vectorSearchを使用して返すスコアには影響しません。
MongoDB ベクトル検索事前フィルター
$vectorSearch filter オプションは、BSON ブール値、日付、objectId、数値、string、UUID の値(これらのタイプの配列を含む)をマッチングします。
データのフィルタリング基準とするフィールドには、vectorSearch タイプのインデックス定義に含まれるフィルタータイプとしてインデックスを作成する必要があります。データをフィルタリングすると、セマンティック検索の範囲が絞り込まれ、すべてのベクトルが比較対象とならないように徹底するのに役立ちます。
MongoDB ベクトル検索$vectorSearchfilter は、次のMQL演算子に対して オプションをサポートしています。
タイプ | MQL 演算子 |
|---|---|
Equality(等価) | |
Range(範囲) | |
「イン」セット | |
存在 | |
論理 |
注意
$vectorSearchfilter オプションは、他のクエリ演算子、集計パイプライン演算子、またはMongoDB Search 演算子をサポートしていません。
フィルターに関する考慮事項
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 ベクトル検索インデックスの作成手順を参照し、基本的な例またはフィルター例の構成を希望言語でコピーします。
注意
mongosh を使用する場合、マシンによってはサンプルコードから queryVector をターミナルに貼り付けるのに時間がかかる場合があります。