MongoDB ベクトル検索クエリは、 $vectorSearchを第 1 ステージとして使用する 集計パイプラインの形式をとります。このガイドでは、$vectorSearch ステージの構文、オプション、および動作について説明します。
$vectorSearch$vectorSearchステージは、指定されたフィールドに対してクエリベクトルのセマンティック検索を実行します。フィールドは vectorSearch タイプのインデックス内でMongoDB ベクトル検索 ベクトル タイプとしてインデックス付けする必要があります。
注意
MongoDB ベクトル検索 は、 MongoDB v6.0.11を実行中クラスターで ANN 検索をサポートしています。v7.0.2 以降 およびMongoDB v.. を実行中クラスターでの ENN 検索6016v7.0.10、v7.3.2、以降に更新します。
サポートされているクライアント
$vectorSearchAtlas UI、mongosh 、任意のMongoDBドライバー を使用して、 クエリを実行できます。
MongoDB ベクトル検索 は、 Atlas CLI を使用して作成したローカル Atlas 配置で使用することもできます。詳細については、「Atlas 配置のローカル配置の作成」を参照してください。
$vectorSearch は、次の MongoDB バージョンを実行している Atlas クラスターでのみサポートされています。
v6.0.11
v7.0.2 以降( RCを含む)。
構文
検索するフィールドは、vectorSearchインデックスタイプ内にMongoDB ベクトル検索ベクトルタイプとしてインデックス付けする必要があります。
$vectorSearchパイプラインには次のプロトタイプ形式があります。
{ "$vectorSearch": { "exact": true | false, "filter": {<filter-specification>}, "index": "<index-name>", "limit": <number-of-results>, "numCandidates": <number-of-candidates>, "path": "<field-to-search>", "queryVector": [<array-of-numbers>], "explainOptions": { "traceDocumentIds": [<array-of-documentIDs>] } } }
フィールド
$vectorSearchステージは、次のフィールドを持つドキュメントを取得します。
フィールド | タイプ | 必要性 | 説明 |
|---|---|---|---|
| ブール値 | 任意 |
EXN検索またはANN検索のどちらを実行するかを指定するフラグ。 値は次のいずれかになります。
省略した場合、デフォルトは MongoDB ベクトル検索 はMongoDB v6.0.11を実行中クラスターでの Ann 検索をサポートしますv7.0.2 以降 およびMongoDB v6.0.16を実行中クラスターでの ENN 検索v7.0.10、v7.3.2、以降に更新します。 これらの検索タイプの詳細については、ベクトル検索タイプを参照してください。 |
| ドキュメント | 任意 | インデックス作成されたフィールドを比較してプレフィルターとして使用する MQL 式。ブール値、date、objectId、numeric、string、UUID の値(これらの型の配列を含む)をフィルタリングできます。 MongoDB ベクトル検索がフィルターでサポートしているMQL演算子については、MongoDB ベクトル検索の事前フィルタリングを参照してください。 |
| string | 必須 | 使用するMongoDB ベクトル検索インデックスの名前。 MongoDB ベクトル検索、インデックス名のスペルをうっかり間違えた場合、または指定されたインデックスがクラスター上にまだ存在しない場合には結果が返されません。 |
| 数値 | 必須 | 結果で返されるドキュメントの数( |
| 数値 | 条件付き | このフィールドは、 検索中に使用する最近傍の数。 値は ( 精度を高めるために、返されるドキュメント数( このオーバーリクエスト パターンは、近似最近傍探索でレイテンシと再現率のバランスを取るためのお勧めの方法であり、当社では具体的なデータセットのサイズとクエリ要件に基づきこのパラメーターを調整することをお勧めしています。 このパラメーターに影響する他の変数の詳細については、「 |
| string | 必須 | 検索するインデックス付きのベクトルタイプフィールド。 |
| 数字の配列 | 必須 |
サブタイプ 配列のサイズは、フィールドのインデックス定義で指定されたベクトル データの埋め込みに使用したのと同じモデルを使用してクエリを埋め込む必要があります。 ベクトルサブタイプが同じ限り、完全忠実度ベクトルで埋め込みをクエリできます。これは、サブタイプが |
| ドキュメント | 任意 | explain |
explainOptions.traceDocumentIds | ドキュメントID の配列 | 必須 | ドキュメント |
ベクトル検索のタイプ
$vectorSearch ステージを定義する場合、exactフィールドを使用して近似最近傍探索または厳密最近傍探索を実行するかを指定できます。
近似最近傍探索
近似最近傍探索(ANN)では、MongoDB ベクトル検索は、多次元空間内での近接性と考慮する近傍の数に基づいて、クエリ内のベクトル埋め込みに最も近いデータ内のベクトル埋め込みを検索します。Hierarchical Navigable Small Worldsアルゴリズムを使用し、すべてのベクトルをスキャンすることなく、クエリ内のベクトル埋め込みに最も類似するベクトル埋め込みを見つけます。したがって、近似最近傍探索は、重要なフィルターなしで大規模なデータセットをクエリするのに最適です。
注意
Ann 検索の最適な再現率は通常、enn 検索との結果の重複が約90 95- % であると考えられますが、レイテンシは大幅に低くなります 。これにより、精度とパフォーマンスの適切なバランスが実現できます。MongoDB ベクトル検索でこれを実現するには、クエリ時に 調整 numCandidates パラメータをします。
numCandidates 選択
近似最近傍探索を検索するには、numCandidatesフィールドを指定する必要があります。このフィールドは、MongoDB ベクトル検索が検索する際に考慮する最近傍の数を決定します。
精度を高めるために、返されるドキュメント数(limit)の少なくとも 20 倍である numCandidates 数値を指定することをお勧めします。厳密最近傍探索 クエリ結果と 近似最近傍探索 クエリ結果間の不整合を減らします。例、limit を設定すると 5 結果が返される場合は、開始点として numCandidates を 100 に設定することを検討してください。詳しくは、「クエリ結果の精度を測定する方法」を参照してください。
このオーバーリクエスト パターンは、 近似最近傍探索 検索でレイテンシと 再現率 のトレードオフを行う推奨方法です。ただし、特定のデータセット サイズとクエリ要件に基づいて、numCandidates パラメータを調整することをお勧めします。正確な結果が得られるようにするには、次の変数を考慮してください。
インデックスサイズ:コレクションが大きいほど、想起率を維持するためには通常、より大きな
numCandidates値が必要です。数百万のベクトルを含むコレクションは、数千のベクトルを含むコレクションよりもはるかに多くの候補が必要となる可能性があります。制限値:
numCandidatesはインデックスサイズと高い相関関係があるため、limitの値が低い場合、再現率を維持するには、それに比例してnumCandidatesの値を高くする必要があります。ベクトル量子化: 量子化ベクトルはストレージコストを削減させますが、精度は低下します。量子化ベクトル(
int8またはint1サブタイプ)を使用する場合、完全精度のfloat32ベクトルに匹敵する再現率を維持するには、numCandidates値の引き上げが必要になることがあります。
ENN 検索
厳密最近傍探索の場合、MongoDB ベクトル検索は、すべての埋め込み間の距離を計算してすべてのインデックスが付けられたベクトル埋め込みを網羅的に検索し、クエリ内のベクトル埋め込みに対して厳密最近傍探索を見つけます。これは計算負荷が高く、 クエリレイテンシに悪影響を影響可能性があります。したがって、次のユースケースには 厳密最近傍探索 が推奨されます。
厳密最近傍探索クエリの理想的で正確な結果を使用して、近似最近傍探索クエリの再現率と精度を決定したい場合。
考慮する最近傍の数を調整する必要なしに、 10000未満のドキュメントをクエリしたい場合
データの5 % 未満が指定されたプレフィルターを満たすコレクションに対して、クエリに選択的なプレフィルターを含めたい。
自動量化を有効にすると、 MongoDB ベクトル検索 はENNクエリの完全忠実度ベクトルのみを使用します。
動作
$vectorSearchは、それが表示されるすべてのパイプラインの最初のステージである必要があります。
制限
$vectorSearchは、ビュー定義と次のパイプライン ステージでは使用できません。
| [1] | このステージには $vectorSearch の結果を渡すことができます。 |
MongoDB ベクトル検索 インデックスの作成
$vectorSearchvectorSearch タイプのインデックス定義内で ステージを使用して検索するフィールドをインデックス必要があります。MongoDB ベクトル検索 vectorSearch タイプのインデックス定義では、次のタイプのフィールドにインデックスことができます。
これらのMongoDB ベクトル検索フィールドタイプの詳細については、「 ベクトル検索のフィールドにインデックスを作成する方法 」を参照してください。
MongoDB ベクトル検索 Score
MongoDB ベクトル検索 は、返されるすべてのドキュメントに、0 から 1 までの固定範囲のスコアを割り当てます(0 は類似性が低く、1 は類似性が高いことを示します)。
スコアは、MongoDB ベクトル検索 インデックス定義 で指定した similarity 関数に従って計算されます。選択できる similarity オプションの詳細については、類似性関数についてを参照してください。
返される各ドキュメントには、メタデータとしてスコアが含まれます。各ドキュメントのスコアと結果セットを返すには、集計パイプラインで $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ステージで使用します。
セグメント間でのクエリの並列実行
ベクトル検索クエリー処理を分離するには、専用の検索ノードをお勧めします。専用の検索ノードではクエリのパフォーマンスが向上する場合があります。高 CPU システムではパフォーマンスがさらに向上する可能性があることに注意してください。MongoDB ベクトル検索 が検索ノードで実行される場合、 MongoDB ベクトル検索 はデータのセグメント全体でクエリの実行を並列化します。
クエリ処理を並列化すると、大規模なデータセットに対するクエリなど、多くのケースで応答時間が向上します。MongoDB ベクトル検索クエリ処理中にクエリ内並列処理を使用すると、より多くのリソースが使用されますが、個々のクエリのレイテンシが向上します。
注意
MongoDB ベクトル検索、各クエリが同時に実行されることは保証されません。例、同時クエリがキューに入れられすぎると、 MongoDB ベクトル検索 はシングルスレッド実行に戻る可能性があります。
同じ連続するクエリに対して一貫性のない結果が表示される場合があります。 これを軽減するには、 $vectorSearchクエリでnumCandidatesの値を増やします。
例
次のクエリは、サンプルのsample_mflix.embedded_moviesを検索します$vectorSearch ステージを使用するコレクション。クエリは、Voyage AIの voyage-3-large 埋め込みモデルを使用して作成された埋め込みを含む plot_embedding_voyage_3_largeフィールドを検索します。
前提条件
これらの例を実行する前に、次のアクションを実行する必要があります。
サンプル コレクションを Atlas クラスターに追加します。
コレクションのMongoDB ベクトル検索検索インデックスを作成します。手順については、MongoDB ベクトル検索インデックスの作成手順を参照し、基本的な例またはフィルター例の構成を希望言語でコピーします。
注意
mongosh を使用する場合、マシンによってはサンプルコードから queryVector をターミナルに貼り付けるのに時間がかかる場合があります。
基本的な AN の例
次のクエリは、 $vectorSearchステージで string時間移動のベクトル埋め込みを使用してplot_embedding_voyage_3_largeフィールドを検索します。 最大150の最近傍を考慮し、結果として10ドキュメントを返します。 このクエリでは、次の操作を実行するために$projectステージも指定しています。
_idフィールドを除外し、 フィールドとplottitleフィールドのみを結果に含めます。結果内の各ドキュメントのベクトル検索スコアを表示する
scoreという名前のフィールドを追加します。
フィルターされた近似最近傍探索の例
次のクエリは、サンプル ベクトル データに対してセマンティック検索を実行する前に、 01年 1 月1955から 1 月01日1975の間にリリースされた映画のドキュメントをフィルタリングします。 $and演算子を使用して、指定された日付の論理AND演算を実行します。 次に、string charactersのベクトル埋め込みを使用して、フィルタリングされたドキュメント内のplot_embedding_voyage_3_largeフィールドで150の最近傍を検索し、結果として10ドキュメントを返します。 このクエリでは、次の操作を実行するために$projectステージも指定しています。
_idフィールドを除外し、結果にはplot、title、yearフィールドのみを含めます。結果内にドキュメントのベクトル検索スコアを表示する
scoreという名前のフィールドを追加します。
MongoDB ベクトル検索 は、 1955から1975の範囲の yearフィールド値に基づいてドキュメントをフィルタリングします。プロットには、1955 から 1975 の間に公開された映画のプロットに、リクエストの結果をまとめたドキュメントが返されます。
Tip
追加のフィルター例
「 Atlas クラスターのデータに対してセマンティック検索を実行する方法 」では、 sample_mflix.embedded_moviesコレクション内の埋め込みデータに対するセマンティック検索クエリの他の事前フィルターについて説明します。
ENN の例
次のクエリは、 $vectorSearchステージでstringのベクトル埋め込みを使用してplot_embedding_voyage_3_largeフィールドを検索します。 完全一致をリクエストし、結果を10ドキュメントのみに制限します。 このクエリでは、次の操作を実行するために$projectステージも指定しています。
_idフィールドを除外し、結果にはplot、title、yearフィールドのみを含めます。結果内にドキュメントのベクトル検索スコアを表示する
scoreという名前のフィールドを追加します。