Overview
MongoDB ベクトル検索 を使用すると、 MongoDB Atlasに保存されているベクトル埋め込みに対してセマンティック検索を実行できます。 MongoDB ベクトル検索クエリを実行する前に、インデックスを作成するフィールドと、それらがインデックス化される方法を指定するインデックスを作成する必要があります。
MongoDB ベクトル検索の詳細については、 MongoDB ベクトル検索ドキュメントの MongoDB Vector ベクトル検索 の概要 を参照してください。
サンプル データ
このガイドの例では、Atlasサンプルデータセットのsample_mflixデータベース内のmoviesコレクションを使用します。MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、MongoDBを使い始めるガイドを参照してください。
C++アプリケーションから sample_mflixコレクションのMongoDB ベクトル検索インデックスを管理するには、まず Atlas クラスターに接続する mongocxx::client をインスタンス化し、次の値を db 変数と collection 変数に割り当てます。
auto db = client["sample_mflix"]; auto collection = db["movies"];
次に、collection 変数で search_indexes() メソッドを呼び出して、コレクションで mongocxx::search_index_view をインスタンス化します。
auto siv = collection.search_indexes();
mongocxx::search_index_viewクラスには、 MongoDB ベクトル検索インデックスを操作できる次のメンバー関数が含まれています。
create_one(): 指定された構成でMongoDB ベクトル検索インデックスを作成しますlist():コレクションのMongoDB ベクトル検索と検索インデックスのリストをポイントするmongocxx::cursorオブジェクトを返しますupdate_one(): 指定されたMongoDB ベクトル検索インデックスの定義を更新しますdrop_one():コレクションから指定したインデックスを削除します
次のセクションでは、 MongoDB ベクトル検索 の各インデックス管理メソッドの使用方法を示すコード例を示します。
注意
MongoDB ベクトル検索インデックス管理は非同期
MongoDB C++ドライバーはMongoDB ベクトル検索インデックスを非同期に管理します。以下のセクションで説明されているライブラリ メソッドは、サーバー応答をすぐに返しますが、 MongoDB ベクトル検索インデックスへの変更はバックグラウンドで行われ、しばらくが完了しないまで完了しない可能性があります。
MongoDB ベクトル検索インデックスの作成
コレクションに単一のMongoDB ベクトル検索インデックスを作成するには、mongocxx::search_index_viewオブジェクトで create_one() メソッドを呼び出し、作成するインデックスを指定する mongocxx::search_index_modelオブジェクトでを渡します。
mongocxx::search_index_model コンストラクターには次の引数が必要です。
name:インデックスの名前を指定する stringdefinition:インデックスのフィールドを設定する方法を指定するドキュメント
Tip
MongoDB ベクトル検索インデックスで構成できるフィールドの完全なリストについては、 MongoDB ベクトル検索ベクトル検索の「 MongoDB Vector Search インデックス フィールド 」の参照セクションを参照してください。
次の例は、単一のMongoDB ベクトル検索インデックスを作成する方法を示しています。
// Define the index model with an index name and a definition document auto model = mongocxx::search_index_model( "<vectorSearchIndexName>", make_document( kvp("fields", make_array(make_document( kvp("type", "vector"), kvp("path", "<fieldName>"), kvp("numDimensions", 2048), kvp("similarity", "dotProduct"), kvp("quantization", "scalar")))))); model.type("vectorSearch"); // Creates the vector search index auto result = siv.create_one(model); std::cout << "New vector search index name: " << result << std::endl;
New vector search index name: vector_search
ベクトル検索インデックスには、次の定義があります。
type:インデックスのタイプはvectorSearchです。path:インデックスはplot_embedding_voyage_3_largeフィールドにあります。numDimensions:ベクトル埋め込みの次元数は2048です。similarity:インデックスはdotProduct類似性を使用して類似性を測定します。quantization:インデックスはscalar量子化を使用します。
MongoDB ベクトル検索インデックスの一覧表示
コレクションのすべての検索インデックスを一覧表示するには、mongocxx::search_index_viewオブジェクトで list() メソッドを呼び出します。このメソッドは、コレクションのMongoDB ベクトル検索とMongoDB Search インデックスを反復処理するために使用できる mongocxx::cursorオブジェクトを返します。
次の例では、指定されたコレクションで使用可能な検索インデックスの一覧を出力します。
auto cursor = siv.list(); for (auto const& doc : siv.list()) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "id" : ..., "name" : "vector_index", "type" : "vectorSearch", ..., "latestDefinition" : { "fields" : [ { "type" : "vector", "path" : "plot_embedding_voyage_3_large", "numDimensions" : 2048, ...}
あるいは、インデックス名を list() メソッドに渡すことで、個々のMongoDB ベクトル検索インデックスを一覧表示することもできます。これにより、指定されたインデックスのみを含む結果セットを指す mongocxx::cursorオブジェクトが返されます。
次の例では、list() メソッドを使用して、vector_index という名前のインデックスを返します。
for (auto const& doc : siv.list("vector_index")) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "id" : ..., "name" : "vector_index", "type" : "vectorSearch", ..., "latestDefinition" : { "fields" : [ { "type" : "vector", "path" : "plot_embedding_voyage_3_large", "numDimensions" : 2048, ...}
MongoDB ベクトル検索インデックスの更新
MongoDB ベクトル検索インデックスを更新するには、mongocxx::search_index_viewオブジェクトで update_one() メソッドを呼び出し、更新するインデックスの名前と、インデックスを更新する定義を渡します。
次の例は、前回のMongoDB ベクトル検索インデックスの作成 の例から既存のMongoDB Vector ベクトル検索インデックスを更新して、 euclideandotProduct類似性の代わりにbinary を使用し、scalar 量子化の代わりに を使用する方法を示しています。
auto definition = make_document( kvp("fields", make_array(make_document( kvp("type", "vector"), kvp("path", "plot_embedding_voyage_3_large"), kvp("numDimensions", 2048), kvp("similarity", "euclidean"), kvp("quantization", "binary"))))); siv.update_one("vector_index", definition.view());
MongoDB ベクトル検索インデックスの削除
MongoDB ベクトル検索インデックスをコレクションから削除するには、mongocxx::search_index_viewオブジェクトで drop_one() メソッドを呼び出し、削除するインデックスの名前を渡します。
次の例は、vector_index という名前のMongoDB ベクトル検索インデックスを削除する方法を示しています。
siv.drop_one("vector_index");
詳細情報
C++ドライバーでインデックスを管理する方法を示すサンプルアプリケーションについては、「 インデックスのガイド 」を参照してください。
MongoDB ベクトル検索機能の使用方法とMongoDB ベクトル検索インデックスの定義方法の詳細については、次のMongoDB ベクトル検索ドキュメント ページを参照してください。
API ドキュメント
このガイドで説明されているメソッドの詳細については、次のAPIドキュメントを参照してください。