Docs Menu
Docs Home
/ /

ベクトル検索クエリの実行

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ステージは、次のフィールドを持つドキュメントを取得します。

フィールド
タイプ
必要性
説明

exact

ブール値

任意

numCandidatesを省略する場合は、これが必要です。

EXN検索またはANN検索のどちらを実行するかを指定するフラグ。 値は次のいずれかになります。

  • false - Ann検索を実行する場合

  • true - ENN検索を実行する場合

省略した場合、デフォルトは false になります。

MongoDB ベクトル検索 はMongoDB v6.0.11を実行中クラスターでの Ann 検索をサポートしますv7.0.2 以降 およびMongoDB v6.0.16を実行中クラスターでの ENN 検索v7.0.10、v7.3.2、以降に更新します。

これらの検索タイプの詳細については、ベクトル検索タイプを参照してください。

filter

ドキュメント

任意

インデックス作成されたフィールドを比較してプレフィルターとして使用する MQL 式。ブール値、date、objectId、numeric、string、UUID の値(これらの型の配列を含む)をフィルタリングできます。

MongoDB ベクトル検索がフィルターでサポートしているMQL演算子については、MongoDB ベクトル検索の事前フィルタリングを参照してください。

index

string

必須

使用するMongoDB ベクトル検索インデックスの名前。

MongoDB ベクトル検索、インデックス名のスペルをうっかり間違えた場合、または指定されたインデックスがクラスター上にまだ存在しない場合には結果が返されません。

limit

数値

必須

結果で返されるドキュメントの数( intのみ)。 numCandidatesを指定する場合、この値はnumCandidatesの値を超えることはできません。

numCandidates

数値

条件付き

このフィールドは、 exactfalseまたは省略されている場合に必須です。

検索中に使用する最近傍の数。 値は ( <=10000以下である必要があります。 返されるドキュメント数より小さい数値は指定できません( limit )。

精度を高めるために、返されるドキュメント数(limit)の 20 倍以上を指定することをお勧めします。

このオーバーリクエスト パターンは、近似最近傍探索でレイテンシと再現率のバランスを取るためのお勧めの方法であり、当社では具体的なデータセットのサイズとクエリ要件に基づきこのパラメーターを調整することをお勧めしています。

このパラメーターに影響する他の変数の詳細については、「numCandidates の選択」を参照してください。

path

string

必須

検索するインデックス付きのベクトルタイプフィールド。

queryVector

数字の配列

必須

float32 の数値の配列、サブタイプ float32BSON BinData ベクトル、またはサブタイプ int1 または int8BSON BinData ベクトルで、クエリ ベクトルを表します。

サブタイプ float32int8int1を持つ BSON binData ベクトルの生成の詳細については、「事前に量子化されたベクトルを取り込む方法」をご覧ください。

配列のサイズは、フィールドのインデックス定義で指定されたベクトル dimensions の数と一致しなければなりません。

データの埋め込みに使用したのと同じモデルを使用してクエリを埋め込む必要があります。

ベクトルサブタイプが同じ限り、完全忠実度ベクトルで埋め込みをクエリできます。これは、サブタイプが float32 を持つ binData ベクトルでのみ可能です。他のサブタイプ(int8 または int1)を使用する場合、 MongoDB ベクトル検索 は結果またはエラーを返しません。

explainOptions

ドキュメント

任意

explain executionStatsクエリでベクトルのリスト(_id によって識別される)を追跡します。このオプションは explain なしでは使用できません。詳細については、MongoDB ベクトル検索結果の説明を参照してください。

explainOptions.
traceDocumentIds

ドキュメントID の配列

必須

ドキュメント_id のリスト。

$vectorSearch ステージを定義する場合、exactフィールドを使用して近似最近傍探索または厳密最近傍探索を実行するかを指定できます。

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

注意

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

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

精度を高めるために、返されるドキュメント数(limit)の少なくとも 20 倍である numCandidates 数値を指定することをお勧めします。厳密最近傍探索 クエリ結果と 近似最近傍探索 クエリ結果間の不整合を減らします。例、limit を設定すると 5 結果が返される場合は、開始点として numCandidates100 に設定することを検討してください。詳しくは、「クエリ結果の精度を測定する方法」を参照してください。

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

  • インデックスサイズ:コレクションが大きいほど、想起率を維持するためには通常、より大きな numCandidates 値が必要です。数百万のベクトルを含むコレクションは、数千のベクトルを含むコレクションよりもはるかに多くの候補が必要となる可能性があります。

  • 制限値numCandidates はインデックスサイズと高い相関関係があるため、limit の値が低い場合、再現率を維持するには、それに比例して numCandidates の値を高くする必要があります。

  • ベクトル量子化: 量子化ベクトルはストレージコストを削減させますが、精度は低下します。量子化ベクトル(int8 または int1 サブタイプ)を使用する場合、完全精度の float32 ベクトルに匹敵する再現率を維持するには、numCandidates 値の引き上げが必要になることがあります。

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

  • 厳密最近傍探索クエリの理想的で正確な結果を使用して、近似最近傍探索クエリの再現率と精度を決定したい場合。

  • 考慮する最近傍の数を調整する必要なしに、 10000未満のドキュメントをクエリしたい場合

  • データの5 % 未満が指定されたプレフィルターを満たすコレクションに対して、クエリに選択的なプレフィルターを含めたい。

自動量化を有効にすると、 MongoDB ベクトル検索 はENNクエリの完全忠実度ベクトルのみを使用します。

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

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

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

$vectorSearchvectorSearch タイプのインデックス定義内で ステージを使用して検索するフィールドをインデックス必要があります。MongoDB ベクトル検索 vectorSearch タイプのインデックス定義では、次のタイプのフィールドにインデックスことができます。

  • ベクトル型としてのベクトル埋め込みを含むフィールド。

  • 事前にフィルタリングされたデータでベクトル検索を可能にするフィルタータイプとしての追加フィールド。

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

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

スコアは、MongoDB ベクトル検索 インデックス定義 で指定した similarity 関数に従って計算されます。選択できる similarity オプションの詳細については、類似性関数についてを参照してください。

返される各ドキュメントには、メタデータとしてスコアが含まれます。各ドキュメントのスコアと結果セットを返すには、集計パイプラインで $project ステージを使用し、score をプロジェクトするフィールドとして構成します。scoreフィールドに、値 vectorSearchScore を持つ $meta式を指定します。構文は次のとおりです。

1db.<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])

注意

vectorSearchScorescore $meta 式として使用できるのは、$vectorSearch パイプラインステージの後のみです。他のクエリの後に vectorSearchScore を使用すると、 MongoDB はMongoDB v8.2 以降の警告をログに記録します。

注意

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

$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") }
  • $and MQL 演算子を使用して、1 回のクエリでフィルターの配列を指定できます。

    たとえば、genres フィールドが Action に等しく、かつ year フィールドの値が 19992000、または 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フィールドを検索します。

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

注意

mongosh を使用する場合、マシンによってはサンプルコードから queryVector をターミナルに貼り付けるのに時間がかかる場合があります。

次のクエリは、 $vectorSearchステージで string時間移動のベクトル埋め込みを使用してplot_embedding_voyage_3_largeフィールドを検索します。 最大150の最近傍を考慮し、結果として10ドキュメントを返します。 このクエリでは、次の操作を実行するために$projectステージも指定しています。

  • _idフィールドを除外し、 フィールドとplot titleフィールドのみを結果に含めます。

  • 結果内の各ドキュメントのベクトル検索スコアを表示するscoreという名前のフィールドを追加します。

次のクエリは、サンプル ベクトル データに対してセマンティック検索を実行する前に、 01年 1 月1955から 1 月01日1975の間にリリースされた映画のドキュメントをフィルタリングします。 $and演算子を使用して、指定された日付の論理AND演算を実行します。 次に、string charactersのベクトル埋め込みを使用して、フィルタリングされたドキュメント内のplot_embedding_voyage_3_largeフィールドで150の最近傍を検索し、結果として10ドキュメントを返します。 このクエリでは、次の操作を実行するために$projectステージも指定しています。

  • _idフィールドを除外し、結果にはplottitleyearフィールドのみを含めます。

  • 結果内にドキュメントのベクトル検索スコアを表示するscoreという名前のフィールドを追加します。

MongoDB ベクトル検索 は、 1955から1975の範囲の yearフィールド値に基づいてドキュメントをフィルタリングします。プロットには、1955 から 1975 の間に公開された映画のプロットに、リクエストの結果をまとめたドキュメントが返されます。

Tip

追加のフィルター例

Atlas クラスターのデータに対してセマンティック検索を実行する方法 」では、 sample_mflix.embedded_moviesコレクション内の埋め込みデータに対するセマンティック検索クエリの他の事前フィルターについて説明します。

次のクエリは、 $vectorSearchステージでstringのベクトル埋め込みを使用してplot_embedding_voyage_3_largeフィールドを検索します。 完全一致をリクエストし、結果を10ドキュメントのみに制限します。 このクエリでは、次の操作を実行するために$projectステージも指定しています。

  • _idフィールドを除外し、結果にはplottitleyearフィールドのみを含めます。

  • 結果内にドキュメントのベクトル検索スコアを表示するscoreという名前のフィールドを追加します。

戻る

インデックス参照

ルール バッジを取得する

「Vector Search の基礎」を無料で習得できます。

詳細