AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

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

MongoDB ベクトル検索クエリは、 $vectorSearchを最初のステージとして使用する集計パイプラインの形式をとります。このページでは、$vectorSearch ステージの構文、オプション、および動作について説明します。

$vectorSearch

$vectorSearchステージは、次のフィールドを持つドキュメントを取得します。

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

近似近傍(近似最近傍探索)検索

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

注意

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

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

Hierarchical Navigable Small Worldsインデックス構造を使用してベクトル検索を実行すると、 MongoDB ベクトル検索 は優先順位キューを入力して結果を蓄積します。numCandidates パラメーターはこのキューのサイズを制御し、上位のlimit 結果を返すまでに検索する時間を決定します。キューが大きいほど(numCandidates より大きい)、検索は Hierarchical Navigable Small Worldsグラフ をより多く調査でき、 クエリレイテンシが増加する可能性をコストにして、より優れた一致を見つける可能性があります。

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

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

完全厳密最近傍探索

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

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

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

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

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

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

注意

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

MongoDB ベクトル検索 はデータのフィルタリングをサポートしています。ここでは、次の作業が可能です。

Atlas ベクトル検索 の事前フィルターと事後フィルター

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

    たとえば、genres フィールドが Action に等しく、かつ year フィールドの値が 19992000、または 2001 に等しいドキュメントの次のプレフィルターを考えてみましょう。

    "filter": {
    "$and": [
    { "genres": "Action" },
    { "year": { "$in": [ 1999, 2000, 2001 ] } }
    ]
    }
  • ファジー検索、フレーズ一致、ロケーション フィルタリング、ロケーション フィルタリング、その他の分析テキストなどの高度なフィルタリング機能については、vectorSearch 演算子を使用します。$search ステージで。

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