vectorSearch タイプを使用して、$vectorSearch クエリを実行するためのフィールドにインデックスを作成できます。クエリするベクトル埋め込みのインデックスと、データを事前にフィルタリングするために使用する追加フィールドを定義できます。データをフィルタリングすると、セマンティック検索の範囲が絞り込まれ、マルチテナント環境などで特定のベクトル埋め込みを比較対象から排除するのに役立ちます。
MongoDBmongosh ベクトル検索インデックスを作成するには、 Atlas UI、 Atlas Admin API、Atlas CLI、 、サポートされているMongoDBドライバー を使用できます。
注意
非推奨のknnBeta演算子を使用して、 vectorSearch型のインデックス定義を使用してインデックス付けされたフィールドをクエリすることはできません。
Considerations
vectorSearch 型のインデックス定義では、単一要素のみを含む配列のインデックスを作成できます。ドキュメントの配列内にフィールドを埋め込み、またはオブジェクトの配列内にフィールドを埋め込むインデックスはできません。ドット表記を使用して、ドキュメント内の埋め込みフィールドにインデックスことができます。同じ埋め込みフィールドを、同じインデックス定義内で複数回インデックスすることはできません。
埋め込みのインデックスを作成する前に、クラスターの効率的なストレージのために、埋め込みをサブタイプ float32、int1、または int8 を持つ BSON ベクトルに変換することをお勧めします。詳細については、埋め込みをBSONベクトルに変換する方法を参照してください。
MongoDB ベクトル検索インデックスを使用すると、Atlas クラスターのアイドルノードでリソース消費が上昇する可能性があります。これは、 MongoDB ベクトル検索のさまざまな重要な操作を実行する基礎の mongot プロセスによるものです。アイドルノードでの CPU 使用率は、インデックスの数、複雑さ、サイズによって異なる場合があります。
インデックスのサイズに関する考慮事項について詳しくは、「ベクトルのインデックス作成におけるメモリ要件」を参照してください。
MongoDB ベクトル検索インデックスを定義したコレクションに変更を加えた場合、クエリですぐに最新データを使用できない場合があります。ただし、mongot は変更ストリームをモニターし、保存されたデータのコピーをアップデートするため、 MongoDB ベクトル検索インデックスは結果一貫性を確保します。Atlas UIでインデックス作成された Documents の数を表示して、コレクションへの変更がインデックスに反映されていることを確認できます。
あるいは、コレクションに新しいドキュメントを追加した後に新しいインデックスを作成し、インデックスがクエリ可能になるまで待つこともできます。また、次のようなポーリング ロジックを実装して、インデックスの使用を試みる前にインデックスの準備ができていることを確認することもできます。
例
console.log("Polling to check if the index is ready. This may take up to a minute.") let isQueryable = false; while (!isQueryable) { const cursor = collection.listSearchIndexes(); for await (const index of cursor) { if (index.name === result) { if (index.queryable) { console.log(`${result} is ready for querying.`); isQueryable = true; } else { await new Promise(resolve => setTimeout(resolve, 5000)); } } } }
サポートされているクライアント
MongoDB ベクトル検索インデックスは、 Atlas UI、 、Atlas CLI、 Atlasmongosh 管理API、および次のMongoDBドライバー を使用して作成、管理できます。
構文
次の構文は、 vectorSearchインデックス タイプを定義します。
1 { 2 "fields":[ 3 { 4 "type": "vector", 5 "path": "<field-to-index>", 6 "numDimensions": <number-of-dimensions>, 7 "similarity": "euclidean | cosine | dotProduct", 8 "quantization": "none | scalar | binary", 9 "hnswOptions": { 10 "maxEdges": <number-of-connected-neighbors>, 11 "numEdgeCandidates": <number-of-nearest-neighbors> 12 } 13 }, 14 { 15 "type": "filter", 16 "path": "<field-to-index>" 17 }, 18 ... 19 ] 20 }
MongoDB ベクトル検索インデックス フィールド
MongoDB ベクトル検索インデックス定義には次のフィールドがあります。
オプション | タイプ | 必要性 | 目的 |
|---|---|---|---|
| フィールド定義ドキュメントの配列 | 必須 | インデックスへのベクトルフィールドとフィルター フィールドの定義。ドキュメントごとに 1 つの定義。各フィールド定義ドキュメントは、インデックスを作成するフィールドの
|
fields.type | 文字列 | 必須 |
詳しくは、「 型について |
fields.path | 文字列 | 必須 | インデックスを作成するフィールドの名前。ネストされたフィールドの場合は、ドット表記を使用して埋め込みフィールドへのパスを指定します。 |
fields.numDimensions | Int | 必須 | MongoDB ベクトル検索 がインデックス作成時およびクエリ時に強制されるベクトル次元の数。このフィールドは 量子化ベクトルまたは BinData のインデックス作成には、次のいずれかの値を指定できます。
選択した埋め込みモデルによってベクトル埋め込みの次元数が決まります。出力の次元数に関して複数のオプションを持つモデルもあります。詳細については、「埋め込みを作成する方法の選択」を参照してください。 |
fields.similarity | 文字列 | 必須 | 上位 K 近傍の検索に使用するベクトル類似度関数。このフィールドは 次のいずれかの値を指定できます。
詳細については、「 類似性関数について 」を参照してください。 |
fields.quantization | 文字列 | 任意 | ベクトルの自動ベクトル量子化のタイプ。埋め込みが 次のいずれかの値を指定できます。
詳細については、「 ベクトル量子化 」を参照してください。 |
fields.hnswOptions | オブジェクト | 任意 | Hierarchical Navigable Small Worldsグラフの構築に使用するパラメーター。省略した場合、は 重要: これはプレビュー機能として利用できます。デフォルト値を変更すると、 MongoDB ベクトル検索インデックスとクエリに悪影響を影響可能性があります。 |
fields.hnswOptions.maxEdges | Int | 任意 | Hierarchical Navigable Small Worldsグラフでノードが持つことができるエッジ(または接続)の最大数。値は、両端を含む 数値が大きいほど、グラフの接続がより適切になるため、再現率(検索結果の精度)が向上します。ただし、グラフノードごとに評価する近傍の数であるため、クエリ速度は低下し、各ノードがより多くの接続を保存するためHierarchical Navigable Small Worldsグラフのメモリが増加し、 MongoDB ベクトル検索 がより多くの近傍を評価し、 を調整するためインデックス作成が遅くなります。グラフに追加されたすべての新しいノード。 |
fields.hnswOptions.numEdgeCandidates | Int | 任意 | クエリ時の 数値が大きいほど、高品質な接続を持つグラフが提供され、検索品質(リコール)が向上しますが、クエリのレイテンシに悪影響を与える可能性もあります。 |
vector 型について
インデックス定義の vector フィールドには、次のいずれかのタイプの数値の配列が含まれている必要があります。
BSON
doubleBSON BinData
vectorサブタイプfloat32BSON BinData
vectorサブタイプint1BSON BinData
vectorサブタイプint8
注意
データ用にサブタイプfloat32 int1 またはint8 を持つ BSON BinData ベクトルの生成の詳細については、「事前に量子化されたベクトルを取り込む方法」をご覧ください。
ベクトル フィールドは、fields 配列内の vector タイプとしてインデックスする必要があります。
次の構文は、 vectorフィールド型を定義します。
1 { 2 "fields":[ 3 { 4 "type": "vector", 5 "path": <field-to-index>, 6 "numDimensions": <number-of-dimensions>, 7 "similarity": "euclidean | cosine | dotProduct", 8 "quantization": "none | scalar | binary", 9 "hnswOptions": { 10 "maxEdges": <number-of-connected-neighbors>, 11 "numEdgeCandidates": <number-of-nearest-neighbors> 12 } 13 }, 14 ... 15 ] 16 }
類似度関数について
MongoDB ベクトル検索 は次の類似性関数をサポートしています。
euclidean- ベクトルの端点間の距離を測定します。この値により、さまざまな次元に基づいて類似性を測定できます。詳しくは、「Euclidean」を参照してください。cosine- ベクトル間の角度に基づいて類似性を測定します。 この値により、大きさでスケーリングされない類似性を測定できます。cosineでは絶対値ゼロのベクトルは使用できません。 コサイン類似度を測定するには、ベクトルを正規化し、代わりにdotProductを使用することをお勧めします。dotProduct-cosineと同様の類似性を測定しますが、ベクトルの大きさを考慮します。 大きさを正規化すると、類似性の測定においてcosineとdotProductはほぼ同じになります。dotProductを使用するには、インデックス作成時とクエリ時にベクトルを単位の長さで正規化する必要があります。
次の表は、さまざまなタイプの類似性関数を示しています。
ベクトル埋め込みタイプ | euclidean | cosine | dotProduct |
|---|---|---|---|
| ✓ | ||
| ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ |
ベクトル取り込み用。
自動スカラーまたはバイナリ定量化用。
最高のパフォーマンスを得るには、埋め込みモデルをチェックして、どの類似度関数が埋め込みモデルの訓練プロセスと一致するかを判断します。 ガイダンスがない場合は、dotProduct から開始してください。 fields.similarity を dotProduct の値に設定すると、角度と大きさの両方に基づいて類似性を効率的に測定できます。 dotProduct は cosine よりも計算リソースの消費量が少なく、ベクトルが単位の長さの場合に効率的です。 ただし、ベクトルが正規化されていない場合は、サンプルクエリの結果の類似性スコアを euclidean 距離と cosine 類似性について評価して、どれが妥当な結果に対応しているかを判断してください。
filter 型について
データを事前にフィルタリングするために追加フィールドにインデックスを作成することもオプションで可能です。ブール値、date、objectId、numeric、string、UUID の値(これらの型の配列を含む)をフィルタリングできます。データをフィルタリングすると、セマンティック検索の範囲が絞り込まれ、すべてのベクトルが比較対象とならないように徹底するのに役立ちます。類似性比較の実行対象となるドキュメント数が減るため、クエリのレイテンシの短縮と検索結果の精度向上を図ることができます。
fields 配列内で filter タイプを使用して、フィルタリングするフィールドをインデックス必要があります。
次の構文は、 filterフィールド型を定義します。
1 { 2 "fields":[ 3 { 4 "type": "vector", 5 ... 6 }, 7 { 8 "type": "filter", 9 "path": "<field-to-index>" 10 }, 11 ... 12 ] 13 }
注意
データを事前にフィルタリングしても、 MongoDB ベクトル検索 が クエリに$vectorSearchScore $vectorSearchを使用して返すスコアには影響しません。
MongoDB ベクトル検索インデックスの作成
Atlas UI、 Atlas 管理API 、 Atlas CLI を使用して、クラスター上の任意の種類のデータに対して、長さが 8192 次元以下のベクトル埋め込みを含むすべてのコレクションに対するMongoDB ベクトル検索インデックスを作成できます。mongosh、またはサポートされているMongoDBドライバー。
前提条件
MongoDB ベクトル検索インデックスを作成するには、次の前提条件を持つクラスターが必要です。
MongoDB バージョン
6.0.11、7.0.2、または 以上MongoDB ベクトル検索インデックスの作成対象のコレクション
注意
mongosh コマンドまたはドライバーヘルパーメソッドを使用して、すべての Atlas クラスター階層にMongoDB ベクトル検索インデックスを作成できます。サポートされているドライバー バージョンのリストについては、 サポートされているクライアント を参照してください。
必要なアクセス権
Project Data Access AdminMongoDB ベクトル検索インデックスを作成および管理するには、 以上のロールが必要です。
インデックスの制限
インデックス作成数の上限は以下のとおりです。
M0クラスターの3インデックス (タイプに関係なく、searchまたはvector)。Flex クラスターで 10 インデックス。
単一の M10+ クラスターには、2,500 以下の検索インデックスを作成することを推奨します。
手順
注意
この手順には、sample_mflixデータベース内の embedded_moviesコレクションのインデックス定義の例が含まれています。サンプルデータを クラスターにロードし、このコレクションの例MongoDB ベクトル検索インデックスを作成すると、このコレクションに対してサンプル$vectorSearch クエリを実行できます。実行できるサンプルクエリの詳細については、$vectorSearch の例 を参照してください。
MongoDB ベクトル検索インデックスの表示
Atlas UI、 Atlas 管理API、 Atlas CLI、 mongosh、またはサポートされているMongoDBドライバーから、すべてのコレクションのMongoDB ベクトル検索インデックスを表示できます。
必要なアクセス権
MongoDB ベクトル検索インデックスを表示するには、Project Search Index Editor 以上のロールが必要です。
注意
mongosh コマンドまたはドライバーヘルパーメソッドを使用して、すべての Atlas クラスター階層のMongoDB ベクトル検索インデックスを検索できます。サポートされているドライバー バージョンのリストについては、 サポートされているクライアント を参照してください。
手順
MongoDB ベクトル検索インデックスの編集
既存のMongoDB ベクトル検索インデックスのインデックス定義は、 Atlas UI、 Atlas 管理API、 Atlas CLI、mongosh 、またはサポートされているMongoDBドライバーから変更できます。インデックスの名前を変更したり、インデックスタイプを変更したりすることはできません。インデックスの名前またはタイプを変更する必要がある場合は、新しいインデックスを作成し、古いインデックスを削除する必要があります。
重要
インデックスを編集すると、 MongoDB ベクトル検索 はそのインデックスを再構築します。インデックスの再ビルド中も、古いインデックス定義を使用してベクトル検索クエリを引き続き実行できます。インデックスの再構築が完了すると、古いインデックスは自動的に置き換えられます。このプロセスはMongoDB Search インデックスと同様です。詳しくは、「 MongoDB Search インデックスの作成と更新 」を参照してください。
必要なアクセス権
MongoDB ベクトル検索インデックスを編集するには、Project Search Index Editor 以上のロールが必要です。
注意
mongosh コマンドまたはドライバーヘルパーメソッドを使用して、すべての Atlas クラスター階層のMongoDB ベクトル検索インデックスを編集できます。サポートされているドライバー バージョンのリストについては、 サポートされているクライアント を参照してください。
手順
MongoDB ベクトル検索インデックスの削除
MongoDB ベクトル検索インデックスは、 Atlas UI、 Atlas 管理API、Atlas CLI、mongosh、またはサポートされているMongoDBドライバーからいつでも削除できます。
必要なアクセス権
MongoDB ベクトル検索インデックスを削除するには、Project Search Index Editor 以上のロールが必要です。
注意
mongosh コマンドまたはドライバーヘルパーメソッドを使用して、すべての Atlas クラスター階層上のMongoDB ベクトル検索インデックスを削除できます。サポートされているドライバー バージョンのリストについては、 サポートされているクライアント を参照してください。
手順
インデックスのステータス
MongoDB ベクトル検索インデックスを作成すると、Status 列にはクラスターのプライマリノードにおけるインデックスの現在の状態が表示されます。クラスタ内のすべてのノードにおけるインデックスの状態を表示するには、ステータスの下にある View status details リンクをクリックします。
Status 列が Active の場合、インデックスは使用可能です。そのほかの状態の場合は、インデックスに対するクエリに不完全な結果が返される場合があります。
ステータス | 説明 |
|---|---|
開始前 | Atlas によるインデックスの構築は開始されていません。 |
最初の同期 | Atlas はインデックスを構築中、または編集したインデックスを再構築中です。インデックスがこの状態のとき、次の状況が発生します。
|
アクティブ | インデックスをいつでも使用できます。 |
リカバリ中 | |
失敗 | Atlas によるインデックスのビルドは失敗しました 。View status details モーダルウィンドウのエラーを使用して、問題のトラブルシューティングを行います。詳しくは、「問題の修正」を参照してください。 |
削除中 | Atlas はクラスター ノードからインデックスを削除しています。 |
Atlas によるインデックスの構築中および構築の完了後、Documents 列にはインデックス済みドキュメントの割合と数が表示されます。また、この列には、コレクション内の総ドキュメント数も表示されます。