Atlas Vector Search クイック スタート
このクイック スタートでは、ベクトル埋め込みを含むサンプルドキュメントを Atlas クラスターまたはローカル Atlas 配置にロードし、それらの埋め込みに Atlas Vector Search インデックスを作成し、セマンティック検索を実行してクエリに似たドキュメントを返す方法について説明します。
所要時間: 15 分
目的
このクイック スタートでは、次の手順を実行します。
plot_embedding
フィールドをvector
型としてインデックスするsample_mflix.embedded_movies
コレクションのインデックス定義を作成します。plot_embedding
フィールドには、OpenAI のtext-embedding-ada-002
埋め込みモデルを使用して作成された埋め込みが含まれます。インデックス定義では1536
ベクトル次元を指定し、dotProduct
を使用して類似性を測定します。サンプル
sample_mflix.embedded_movies
コレクションを検索する Atlas Vector Search クエリを実行します。クエリは、$vectorSearch
ステージを使用してplot_embedding
フィールドを検索します。このフィールドには OpenAI のtext-embedding-ada-002
埋め込みモデルを使用して作成された埋め込みが含まれます。このクエリは、ベクトル埋め込みを使用してplot_embedding
フィールドでタイムトラベルという文字列を検索します。最大150
の最近傍を考慮し、結果として10
ドキュメントを返します。
詳細については、「 ラーニングの概要」を参照してください。
ベクトル検索インデックスの作成
➤ このページの例を実行するために使用するクライアントを設定するには、右側のナビゲーション ペインにある [言語を選択] ドロップダウン メニューを使用します。
このセクションでは、Atlas クラスターまたはローカル コンピューターでホストされている配置にロードするサンプル データに Atlas Vector Search インデックスを作成します。
Atlas クラスターを設定します。
Atlas クラスターがまだない場合は、 無料の M 0クラスターを作成します。 Atlas クラスターの作成の詳細については、「 クラスターの作成 」を参照してください。
注意
既存のクラスターを使用している場合は、Atlas プロジェクトへの
Project Data Access Admin
以上のアクセス権が必要です。新しいクラスターを作成する場合は、必要な権限がデフォルトで付与されます。
プロジェクトごとに作成できる
M0
無料クラスターは 1 つだけです。左側のサイドバーで、[ Atlas Search ] をクリックします。 Select data sourceメニューからクラスターを選択し、 Go to Atlas Searchをクリックします。
サンプルデータセットをまだクラスターにロードしていない場合は、[Load a Sample Dataset] をクリックします。[Load Sample Dataset] ダイアログボックスで、[Load Sample Dataset] をクリックして確定します。
サンプルデータセットをすでに読み込んでいる場合は、
sample_mflix
データベースにembedded_movies
コレクションが含まれていることを確認します。含まれていない場合は、サンプルデータベースを削除し、サンプルデータセットを再読み込みします。サンプル データセットのロードが完了するまでに数分かかる場合があります。
ベクトル検索 インデックスを作成します。
注意
mongosh
コマンドまたはドライバーヘルパーメソッドを使用して、すべての Atlas クラスター階層に Atlas Search インデックスを作成できます。サポートされているドライバー バージョンのリストについては、 「サポートされているクライアント」 を参照してください。
サンプル データの読み込みが完了したら、 Create Search Indexをクリックします。
セクションで、 Atlas Vector Searchを選択し、JSON Editor をクリックします。Next
Database and Collectionセクションで、
sample_mflix
データベースを展開し、embedded_movies
コレクションを選択します。この コレクション の各 ドキュメント には、string
plot_embedding
としての映画のプロットの概要を含む、映画に関する情報が含まれています。これはまた、ドキュメントの フィールドに変換され、ベクトル埋め込みとして保存されています。Index Nameフィールドに
vector_index
を指定します。次のベクトル検索インデックスの定義をコピーして JSON エディターに貼り付けます。
1 { 2 "fields": [{ 3 "type": "vector", 4 "path": "plot_embedding", 5 "numDimensions": 1536, 6 "similarity": "dotProduct" 7 }] 8 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
[Next] をクリックします。
[Create Search Index] をクリックします。
インデックスの構築には約 1 分かかります。 ベクトル インデックスの作成が完了すると、 Status列にはActiveが読み取られます。
mongosh
を使用して Atlas クラスターに接続します。ターミナル ウィンドウで
mongosh
を開き、Atlas クラスターに接続します。 接続の詳細な手順については、「 mongosh 経由での接続 」を参照してください。インデックスを作成するコレクションを含むデータベースに切り替えます。
例
use sample_mflix switched to db sample_mflix db.collection.createSearchIndex()
メソッドを実行します。1 db.embedded_movies.createSearchIndex( 2 "vector_index", 3 "vectorSearch", 4 { 5 "fields": [ 6 { 7 "type": "vector", 8 "path": "plot_embedding", 9 "numDimensions": 1536, 10 "similarity": "dotProduct" 11 } 12 ] 13 } 14 ); このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
MongoDB C ドライバーをインストールします。
インストール手順の詳細については、 MongoDB C ドライバー のドキュメントを参照してください。
query-quick-start
という新しいディレクトリを作成します。mkdir query-quick-start ディレクトリを入力し、
CMakeLists.txt
ファイルを作成します。cd query-quick-start touch CMakeLists.txt 以下の行をコピーして、
CMakeLists.txt
ファイルに貼り付けます。cmake_minimum_required(VERSION 3.30) project(atlas-vector-search-quick-start) # Specify the minimum version for creating a vector index. find_package (mongoc-1.0 1.28.0 REQUIRED) add_executable(atlas-vector-search-quick-start vector_index.c ) target_link_libraries (atlas-vector-search-quick-start PRIVATE mongo::mongoc_shared) インデックスを定義します。
vector_index.c
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。vector_index.c1 2 3 4 5 int main(void) { 6 mongoc_client_t *client; 7 mongoc_collection_t *collection; 8 bson_error_t error; 9 char database_name[] = "sample_mflix"; 10 char collection_name[] = "embedded_movies"; 11 char index_name[] = "vector_index"; 12 13 mongoc_init(); 14 15 // Replace the placeholder with your Atlas connection string 16 client = mongoc_client_new("<connection-string>"); 17 18 // Connect to your Atlas cluster 19 collection = mongoc_client_get_collection (client, database_name, collection_name); 20 21 bson_t cmd; 22 // Create search index command. 23 { 24 char *cmd_str = bson_strdup_printf ( 25 BSON_STR ({ 26 "createSearchIndexes" : "%s", 27 "indexes" : [{ 28 "definition": { 29 "fields": [{ 30 "type": "vector", 31 "path": "plot_embedding", 32 "numDimensions": 1536, 33 "similarity": "dotProduct" 34 }] 35 }, 36 "name": "%s", 37 "type": "vectorSearch" 38 }] 39 }), 40 collection_name, index_name); 41 if (!bson_init_from_json(&cmd, cmd_str, -1, &error)) { 42 printf("Failed to initialize BSON: %s\n", error.message); 43 bson_free(cmd_str); 44 return 1; 45 } 46 bson_free (cmd_str); 47 } 48 if (!mongoc_collection_command_simple (collection, &cmd, NULL /* read_prefs */, NULL /* reply */, &error)) { 49 bson_destroy (&cmd); 50 printf ("Failed to run createSearchIndexes: %s", error.message); 51 return 1; 52 } else { 53 printf ("New search index named %s is building.\n", index_name); 54 bson_destroy (&cmd); 55 } 56 57 // Polling for index status 58 printf("Polling to check if the index is ready. This may take up to a minute.\n"); 59 int queryable = 0; 60 while (!queryable) { 61 const char *pipeline_str = "{\"pipeline\": [{\"$listSearchIndexes\": {}}]}"; 62 bson_t pipeline; 63 if (!bson_init_from_json(&pipeline, pipeline_str, -1, &error)) { 64 printf("Failed to initialize pipeline BSON: %s\n", error.message); 65 break; // Exit the loop on error 66 } 67 mongoc_cursor_t *cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, &pipeline, NULL, NULL); 68 const bson_t *got; 69 // Check if the cursor returns any documents 70 int found_index = 0; 71 while (mongoc_cursor_next(cursor, &got)) { 72 bson_iter_t iter; 73 if (bson_iter_init(&iter, got) && bson_iter_find(&iter, "name")) { 74 const char *name = bson_iter_utf8(&iter, NULL); 75 if (strcmp(name, index_name) == 0) { 76 found_index = 1; // Index found 77 bson_iter_find(&iter, "queryable"); 78 queryable = bson_iter_bool(&iter); 79 break; // Exit the loop since we found the index 80 } 81 } 82 } 83 if (mongoc_cursor_error(cursor, &error)) { 84 printf("Failed to run $listSearchIndexes: %s\n", error.message); 85 break; // Exit the loop on error 86 } 87 if (!found_index) { 88 printf("Index %s not found yet. Retrying...\n", index_name); 89 } 90 bson_destroy(&pipeline); 91 mongoc_cursor_destroy(cursor); 92 sleep(5); // Sleep for 5 seconds before checking again 93 } 94 if (queryable) { 95 printf("%s is ready for querying.\n", index_name); 96 } else { 97 printf("Error occurred or index not found.\n"); 98 } 99 100 // Cleanup 101 mongoc_collection_destroy(collection); 102 mongoc_client_destroy(client); 103 mongoc_cleanup(); 104 105 return 0; 106 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true /build
ディレクトリを作成して入力します。mkdir build && cd build プロジェクトを準備します。
cmake ../ アプリをビルドします。
cmake --build . アプリを実行してインデックスを作成します。
./atlas-vector-search-quick-start 1 New search index named vector_index is building. 2 Polling to check if the index is ready. This may take up to a minute. 3 vector_index is ready for querying.
MongoDB C++ドライバーをインストールします。
インストール手順の詳細については、 MongoDB C++ドライバーのドキュメント を参照してください。
query-quick-start
という新しいディレクトリを作成します。mkdir query-quick-start ディレクトリを入力し、
CMakeLists.txt
ファイルを作成します。cd query-quick-start touch CMakeLists.txt 以下の行をコピーして、
CMakeLists.txt
ファイルに貼り付けます。cmake_minimum_required(VERSION 3.30) project(query_quick_start) set(CMAKE_CXX_STANDARD 17) # Specify the minimum version for creating a vector index. find_package(mongocxx 3.11.0 REQUIRED) find_package(bsoncxx REQUIRED) add_executable(query_quick_start vector_index.cpp ) target_link_libraries(query_quick_start PRIVATE mongo::mongocxx_shared) target_link_libraries(query_quick_start PRIVATE mongo::bsoncxx_shared) インデックスを定義します。
vector_index.cpp
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。vector_index.cpp1 2 3 4 5 6 7 8 9 using bsoncxx::builder::basic::kvp; 10 using bsoncxx::builder::basic::make_array; 11 using bsoncxx::builder::basic::make_document; 12 13 int main() { 14 try { 15 mongocxx::instance inst{}; 16 17 // Replace the placeholder with your Atlas connection string 18 const auto uri = mongocxx::uri{"<connection-string>"}; 19 20 // Connect to your Atlas cluster 21 mongocxx::client conn{uri}; 22 auto db = conn["sample_mflix"]; 23 auto collection = db["embedded_movies"]; 24 25 auto siv = collection.search_indexes(); 26 std::string name = "vector_index"; 27 auto type = "vectorSearch"; 28 auto definition = make_document( 29 kvp("fields", 30 make_array(make_document( 31 kvp("type", "vector"), kvp("path", "plot_embedding"), 32 kvp("numDimensions", 1536), kvp("similarity", "dotProduct"))))); 33 auto model = 34 mongocxx::search_index_model(name, definition.view()).type(type); 35 siv.create_one(model); 36 std::cout << "New search index named " << name << " is building." 37 << std::endl; 38 39 // Polling for index status 40 std::cout << "Polling to check if the index is ready. This may take up to " 41 "a minute." 42 << std::endl; 43 bool queryable = false; 44 while (!queryable) { 45 auto indexes = siv.list(); 46 for (const auto& index : indexes) { 47 if (index["name"].get_value() == name) { 48 queryable = index["queryable"].get_bool(); 49 } 50 } 51 if (!queryable) { 52 std::this_thread::sleep_for(std::chrono::seconds(5)); 53 } 54 } 55 std::cout << name << " is ready for querying." << std::endl; 56 } catch (const std::exception& e) { 57 std::cout << "Exception: " << e.what() << std::endl; 58 } 59 return 0; 60 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true /build
ディレクトリを作成して入力します。mkdir build && cd build プロジェクトを準備します。
cmake ../ アプリをビルドします。
cmake --build . アプリを実行してインデックスを作成します。
./query_quick_start 1 New search index named vector_index is building. 2 Polling to check if the index is ready. This may take up to a minute. 3 vector_index is ready for querying.
サンプル データの読み込みが完了したら、 Create Search Indexをクリックします。
セクションで、 Atlas Vector Searchを選択し、JSON Editor をクリックします。Next
Database and Collectionセクションで、
sample_mflix
データベースを展開し、embedded_movies
コレクションを選択します。この コレクション の各 ドキュメント には、string
plot_embedding
としての映画のプロットの概要を含む、映画に関する情報が含まれています。これはまた、ドキュメントの フィールドに変換され、ベクトル埋め込みとして保存されています。Index Nameフィールドに
vector_index
を指定します。次のベクトル検索インデックスの定義をコピーして JSON エディターに貼り付けます。
1 { 2 "fields": [{ 3 "type": "vector", 4 "path": "plot_embedding", 5 "numDimensions": 1536, 6 "similarity": "dotProduct" 7 }] 8 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
[Next] をクリックします。
[Create Search Index] をクリックします。
インデックスの構築には約 1 分かかります。 ベクトル インデックスの作成が完了すると、 Status列にはActiveが読み取られます。
Go モジュールを初期化します。
mkdir go-vector-quickstart && cd go-vector-quickstart go mod init go-vector-quickstart Go ドライバーを依存関係としてプロジェクトに追加します。
go get go.mongodb.org/mongo-driver/mongo インストール手順の詳細については、 MongoDB Go ドライバーのドキュメント を参照してください。
インデックスを定義します。
vector-index.go
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。vector-index.go1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "log" 7 "time" 8 9 "go.mongodb.org/mongo-driver/bson" 10 "go.mongodb.org/mongo-driver/mongo" 11 "go.mongodb.org/mongo-driver/mongo/options" 12 ) 13 14 func main() { 15 ctx := context.Background() 16 17 // Replace the placeholder with your Atlas connection string 18 const uri = "<connectionString>" 19 20 // Connect to your Atlas cluster 21 clientOptions := options.Client().ApplyURI(uri) 22 client, err := mongo.Connect(ctx, clientOptions) 23 if err != nil { 24 log.Fatalf("failed to connect to the server: %v", err) 25 } 26 defer func() { _ = client.Disconnect(ctx) }() 27 28 // Set the namespace 29 coll := client.Database("sample_mflix").Collection("embedded_movies") 30 31 // Define the index details 32 type vectorDefinitionField struct { 33 Type string `bson:"type"` 34 Path string `bson:"path"` 35 NumDimensions int `bson:"numDimensions"` 36 Similarity string `bson:"similarity"` 37 } 38 39 type vectorDefinition struct { 40 Fields []vectorDefinitionField `bson:"fields"` 41 } 42 43 indexName := "vector_index" 44 opts := options.SearchIndexes().SetName(indexName).SetType("vectorSearch") 45 46 indexModel := mongo.SearchIndexModel{ 47 Definition: vectorDefinition{ 48 Fields: []vectorDefinitionField{{ 49 Type: "vector", 50 Path: "plot_embedding", 51 NumDimensions: 1536, 52 Similarity: "dotProduct"}}, 53 }, 54 Options: opts, 55 } 56 57 // Create the index 58 searchIndexName, err := coll.SearchIndexes().CreateOne(ctx, indexModel) 59 if err != nil { 60 log.Fatalf("failed to create the search index: %v", err) 61 } 62 log.Println("New search index named " + searchIndexName + " is building.") 63 64 // Await the creation of the index. 65 log.Println("Polling to check if the index is ready. This may take up to a minute.") 66 searchIndexes := coll.SearchIndexes() 67 var doc bson.Raw 68 for doc == nil { 69 cursor, err := searchIndexes.List(ctx, options.SearchIndexes().SetName(searchIndexName)) 70 if err != nil { 71 fmt.Errorf("failed to list search indexes: %w", err) 72 } 73 74 if !cursor.Next(ctx) { 75 break 76 } 77 78 name := cursor.Current.Lookup("name").StringValue() 79 queryable := cursor.Current.Lookup("queryable").Boolean() 80 if name == searchIndexName && queryable { 81 doc = cursor.Current 82 } else { 83 time.Sleep(5 * time.Second) 84 } 85 } 86 87 log.Println(searchIndexName + " is ready for querying.") 88 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true 以下のコマンドを実行してインデックスを作成します。
go run vector-index.go 2024/10/17 09:38:21 New search index named vector_index is building. 2024/10/17 09:38:22 Polling to check if the index is ready. This may take up to a minute. 2024/10/17 09:38:48 vector_index is ready for querying.
Java ドライバーバージョン 5.2 以降を依存関係としてプロジェクトに追加します。
Maven を使用している場合は、
pom.xml
依存関係リストに次の依存関係を追加してください。<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>[5.2.0,)</version> </dependency> Gradle を使用している場合は、次の依存関係を
build.gradle
依存関係リストに追加します。dependencies { implementation 'org.mongodb:mongodb-driver-sync:[5.2.0,)' }
Java ドライバー JAR ファイルを
CLASSPATH
に追加します。詳しいインストール手順やバージョンの互換性については MongoDB Java Driver のドキュメントを参照ください。
VectorIndex.java
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。VectorIndex.java1 import com.mongodb.client.ListSearchIndexesIterable; 2 import com.mongodb.client.MongoClient; 3 import com.mongodb.client.MongoClients; 4 import com.mongodb.client.MongoCollection; 5 import com.mongodb.client.MongoCursor; 6 import com.mongodb.client.MongoDatabase; 7 import com.mongodb.client.model.SearchIndexModel; 8 import com.mongodb.client.model.SearchIndexType; 9 import org.bson.Document; 10 import org.bson.conversions.Bson; 11 12 import java.util.Collections; 13 import java.util.List; 14 15 public class VectorIndex { 16 17 public static void main(String[] args) { 18 19 // Replace the placeholder with your Atlas connection string 20 String uri = "<connectionString>"; 21 22 // Connect to your Atlas cluster 23 try (MongoClient mongoClient = MongoClients.create(uri)) { 24 25 // Set the namespace 26 MongoDatabase database = mongoClient.getDatabase("sample_mflix"); 27 MongoCollection<Document> collection = database.getCollection("embedded_movies"); 28 29 // Define the index details 30 String indexName = "vector_index"; 31 Bson definition = new Document( 32 "fields", 33 Collections.singletonList( 34 new Document("type", "vector") 35 .append("path", "plot_embedding") 36 .append("numDimensions", 1536) 37 .append("similarity", "dotProduct"))); 38 39 // Define the index model 40 SearchIndexModel indexModel = new SearchIndexModel( 41 indexName, 42 definition, 43 SearchIndexType.vectorSearch()); 44 45 // Create the index 46 try { 47 List<String> result = collection.createSearchIndexes(Collections.singletonList(indexModel)); 48 System.out.println("New search index named " + result.get(0) + " is building."); 49 } catch (Exception e) { 50 throw new RuntimeException("Error creating index: " + e); 51 } 52 53 // Wait for Atlas to build the index 54 System.out.println("Polling to check if the index is ready. This may take up to a minute."); 55 56 ListSearchIndexesIterable<Document> searchIndexes = collection.listSearchIndexes(); 57 Document doc = null; 58 while (doc == null) { 59 try (MongoCursor<Document> cursor = searchIndexes.iterator()) { 60 if (!cursor.hasNext()) { 61 break; 62 } 63 Document current = cursor.next(); 64 String name = current.getString("name"); 65 // When the index completes building, it becomes `queryable` 66 boolean queryable = current.getBoolean("queryable"); 67 if (name.equals(indexName) && queryable) { 68 doc = current; 69 } else { 70 Thread.sleep(500); 71 } 72 } catch (Exception e) { 73 throw new RuntimeException("Failed to list search indexes: " + e); 74 } 75 } 76 System.out.println(indexName + " is ready for querying."); 77 78 } catch (Exception e) { 79 throw new RuntimeException("Error connecting to MongoDB: " + e); 80 } 81 } 82 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true IDE でファイルを実行するか、コマンドラインからコマンドを実行してコードを実行します。
javac VectorIndex.java java VectorIndex New search index named vector_index is building. Polling to check if the index is ready. This may take up to a minute. vector_index is ready for querying.
MongoDB Kotlin コルーチン ドライバーをインストールします。
より詳細なインストール手順とバージョンの互換性については、「MongoDB Kotlin コルーチン ドライバーのドキュメント」を参照してください。
インデックスを定義します。
VectorIndex.kt
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。VectorIndex.kt1 import com.mongodb.MongoException 2 import com.mongodb.client.model.SearchIndexModel 3 import com.mongodb.client.model.SearchIndexType 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.delay 6 import kotlinx.coroutines.flow.toList 7 import org.bson.Document 8 import kotlinx.coroutines.runBlocking 9 10 fun main() { 11 // Replace the placeholder with your MongoDB deployment's connection string 12 val uri = "<connection-string>" 13 val mongoClient = MongoClient.create(uri) 14 val database = mongoClient.getDatabase("sample_mflix") 15 val collection = database.getCollection<Document>("embedded_movies") 16 val indexName = "vector_index" 17 val searchIndexModel = SearchIndexModel( 18 indexName, 19 Document( 20 "fields", 21 listOf( 22 Document("type", "vector") 23 .append("path", "plot_embedding") 24 .append("numDimensions", 1536) 25 .append("similarity", "dotProduct") 26 ) 27 ), 28 SearchIndexType.vectorSearch() 29 ) 30 31 runBlocking { 32 try { 33 collection.createSearchIndexes(listOf(searchIndexModel)) 34 .collect { result -> 35 println("New search index named $result is building.") 36 } 37 38 // Polling to check if the index is queryable 39 println("Polling to check if the index is ready. This may take up to a minute.") 40 var isQueryable = false 41 while (!isQueryable) { 42 delay(5000L) // Poll every 5 seconds 43 44 val indexes = collection.listSearchIndexes().toList() 45 isQueryable = indexes.any { index -> 46 index.getString("name") == indexName && index.getBoolean("queryable") 47 } 48 if (isQueryable) { 49 println("$indexName is ready for querying.") 50 } 51 } 52 } catch (me: MongoException) { 53 System.err.println("An error occurred: $me") 54 } 55 } 56 mongoClient.close() 57 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true IDE で
VectorIndex.kt
ファイルを実行します。 出力は、次のようになります。New search index named vector_index is building. Polling to check if the index is ready. This may take up to a minute. vector_index is ready for querying.
MongoDB Kotlin Sync ドライバーをインストールします。
より詳細なインストール手順とバージョンの互換性については、「MongoDB Kotlin Sync ドライバーのドキュメント」を参照してください。
インデックスを定義します。
VectorIndex.kt
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。VectorIndex.kt1 import com.mongodb.MongoException 2 import com.mongodb.client.model.SearchIndexModel 3 import com.mongodb.client.model.SearchIndexType 4 import com.mongodb.kotlin.client.MongoClient 5 import org.bson.Document 6 7 fun main() { 8 // Replace the placeholder with your MongoDB deployment's connection string 9 val uri = "<connection-string>" 10 val mongoClient = MongoClient.create(uri) 11 val database = mongoClient.getDatabase("sample_mflix") 12 val collection = database.getCollection<Document>("embedded_movies") 13 val indexName = "vector_index" 14 val searchIndexModel = SearchIndexModel( 15 indexName, 16 Document( 17 "fields", 18 listOf( 19 Document("type", "vector") 20 .append("path", "plot_embedding") 21 .append("numDimensions", 1536) 22 .append("similarity", "dotProduct") 23 ) 24 ), 25 SearchIndexType.vectorSearch() 26 ) 27 28 try { 29 val result = collection.createSearchIndexes( 30 listOf(searchIndexModel) 31 ) 32 println("New search index named ${result.get(0)} is building.") 33 34 // Polling to check if the index is queryable 35 println("Polling to check if the index is ready. This may take up to a minute.") 36 var isQueryable = false 37 while (!isQueryable) { 38 val results = collection.listSearchIndexes() 39 results.forEach { result -> 40 if (result.getString("name") == indexName && result.getBoolean("queryable")) { 41 println("$indexName is ready for querying.") 42 isQueryable = true 43 } else { 44 Thread.sleep(5000) // Poll every 5 seconds 45 } 46 } 47 } 48 } catch (me: MongoException) { 49 System.err.println("An error occurred: $me") 50 } 51 mongoClient.close() 52 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true IDE で
VectorIndex.kt
ファイルを実行します。 出力は、次のようになります。New search index named vector_index is building. Polling to check if the index is ready. This may take up to a minute. vector_index is ready for querying.
MongoDB Node ドライバーを依存関係としてプロジェクトに追加します。
npm install mongodb Tip
このページの例では、プロジェクトが CommonJS モジュールとしてモジュールを管理することを前提としています。ES モジュールを使用している場合は、代わりにインポート構文を変更する必要があります。
インデックスを定義します。
vector-index.js
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。vector-index.js1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas deployment 4 const uri = "<connectionString>"; 5 6 const client = new MongoClient(uri); 7 8 async function run() { 9 try { 10 const database = client.db("sample_mflix"); 11 const collection = database.collection("embedded_movies"); 12 13 // define your Atlas Vector Search index 14 const index = { 15 name: "vector_index", 16 type: "vectorSearch", 17 definition: { 18 "fields": [ 19 { 20 "type": "vector", 21 "numDimensions": 1536, 22 "path": "plot_embedding", 23 "similarity": "dotProduct" 24 } 25 ] 26 } 27 } 28 29 // run the helper method 30 const result = await collection.createSearchIndex(index); 31 console.log(`New search index named ${result} is building.`); 32 33 // wait for the index to be ready to query 34 console.log("Polling to check if the index is ready. This may take up to a minute.") 35 let isQueryable = false; 36 while (!isQueryable) { 37 const cursor = collection.listSearchIndexes(); 38 for await (const index of cursor) { 39 if (index.name === result) { 40 if (index.queryable) { 41 console.log(`${result} is ready for querying.`); 42 isQueryable = true; 43 } else { 44 await new Promise(resolve => setTimeout(resolve, 5000)); 45 } 46 } 47 } 48 } 49 } finally { 50 await client.close(); 51 } 52 } 53 run().catch(console.dir); このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true 以下のコマンドを実行してインデックスを作成します。
node vector-index.js New search index named vector_index is building. Polling to check if the index is ready. This may take up to a minute. vector_index is ready for querying.
MongoDB PHP ドライバーをインストールします。
インストール手順の詳細については、 MongoDB PHP ライブラリのドキュメント を参照してください。
インデックスを定義します。
vector-index.php
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。vector-index.zip1 2 3 require 'vendor/autoload.php'; 4 5 // Replace the placeholder with your Atlas connection string 6 $uri = "<connection-string>"; 7 $client = new MongoDB\Client($uri); 8 $collection = $client->sample_mflix->embedded_movies; 9 $indexName = "vector_index"; 10 try { 11 $result = $collection->createSearchIndexes( 12 [[ 13 'name' => $indexName, 14 'type' => 'vectorSearch', 15 'definition' => [ 16 'fields' => [[ 17 'type' => 'vector', 18 'path' => 'plot_embedding', 19 'numDimensions' => 1536, 20 'similarity' => 'dotProduct' 21 ]] 22 ], 23 ]] 24 ); 25 echo "New search index named $result[0] is building." .PHP_EOL; 26 27 // Polling for the index to become queryable 28 echo "Polling to check if the index is ready. This may take up to a minute." .PHP_EOL; 29 $isIndexQueryable = false; 30 while (!$isIndexQueryable) { 31 // List the search indexes 32 $searchIndexes = $collection->listSearchIndexes(); 33 // Check if the index is present and queryable 34 foreach ($searchIndexes as $index) { 35 if ($index->name === $indexName) { 36 $isIndexQueryable = $index->queryable; 37 } 38 } 39 if (!$isIndexQueryable) { 40 sleep(5); // Wait for 5 seconds before polling again 41 } 42 } 43 echo "$indexName is ready for querying." .PHP_EOL; 44 } 45 catch (MongoDB\Driver\Exception\Exception $e) { 46 print 'Error creating the index: ' .$e->getMessage() .PHP_EOL; 47 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true 以下のコマンドを実行してインデックスを作成します。
php vector-index.php New search index named vector_index is building. Polling to check if the index is ready. This may take up to a minute. vector_index is ready for querying.
PyMongoドライバーを依存関係としてプロジェクトに追加します。
pip install pymongo インストール手順の詳細については、 MongoDB Python ドライバーのドキュメント を参照してください。
インデックスを定義します。
vector-index.py
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。vector-index.py1 from pymongo.mongo_client import MongoClient 2 from pymongo.operations import SearchIndexModel 3 import time 4 5 # Connect to your Atlas deployment 6 uri = "<connectionString>" 7 client = MongoClient(uri) 8 9 # Access your database and collection 10 database = client["sample_mflix"] 11 collection = database["embedded_movies"] 12 13 # Create your index model, then create the search index 14 search_index_model = SearchIndexModel( 15 definition={ 16 "fields": [ 17 { 18 "type": "vector", 19 "path": "plot_embedding", 20 "numDimensions": 1536, 21 "similarity": "dotProduct" 22 } 23 ] 24 }, 25 name="vector_index", 26 type="vectorSearch", 27 ) 28 29 result = collection.create_search_index(model=search_index_model) 30 print("New search index named " + result + " is building.") 31 # Wait for initial sync to complete 32 print("Polling to check if the index is ready. This may take up to a minute.") 33 predicate=None 34 if predicate is None: 35 predicate = lambda index: index.get("queryable") is True 36 37 while True: 38 indices = list(collection.list_search_indexes(name)) 39 if len(indices) and predicate(indices[0]): 40 break 41 time.sleep(5) 42 print(result + " is ready for querying.") 43 44 client.close() このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true 以下のコマンドを実行してインデックスを作成します。
python vector-index.py New search index named vector_index is building. Polling to check if the index is ready. This may take up to a minute. vector_index is ready for querying.
サンプル データの読み込みが完了したら、 Create Search Indexをクリックします。
セクションで、 Atlas Vector Searchを選択し、JSON Editor をクリックします。Next
Database and Collectionセクションで、
sample_mflix
データベースを展開し、embedded_movies
コレクションを選択します。この コレクション の各 ドキュメント には、string
plot_embedding
としての映画のプロットの概要を含む、映画に関する情報が含まれています。これはまた、ドキュメントの フィールドに変換され、ベクトル埋め込みとして保存されています。Index Nameフィールドに
vector_index
を指定します。次のベクトル検索インデックスの定義をコピーして JSON エディターに貼り付けます。
1 { 2 "fields": [{ 3 "type": "vector", 4 "path": "plot_embedding", 5 "numDimensions": 1536, 6 "similarity": "dotProduct" 7 }] 8 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
[Next] をクリックします。
[Create Search Index] をクリックします。
インデックスの構築には約 1 分かかります。 ベクトル インデックスの作成が完了すると、 Status列にはActiveが読み取られます。
MongoDB 用の Rust ドライバーをインストールします。
インストール手順の詳細については、 MongoDB Rust ドライバーのドキュメント を参照してください。
インデックスを定義します。
プロジェクトの
/src
ディレクトリに、vector_index.rs
という名前のファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。vector_index.rs1 use std::ops::Index; 2 use std::time::Duration; 3 use futures::{TryStreamExt}; 4 use mongodb::{bson::{Document, doc}, Client, Collection, SearchIndexModel}; 5 use mongodb::SearchIndexType::VectorSearch; 6 use tokio::time::sleep; 7 8 9 pub(crate) async fn vector_index() { 10 // Replace the placeholder with your Atlas connection string 11 let uri = "<connection_string>"; 12 13 // Create a new client and connect to the server 14 let client = Client::with_uri_str(uri).await.unwrap(); 15 16 // Get a handle on the movies collection 17 let database = client.database("sample_mflix"); 18 let my_coll: Collection<Document> = database.collection("embedded_movies"); 19 20 let index_name = "vector_index"; 21 let search_index_def = SearchIndexModel::builder() 22 .definition(doc! { 23 "fields": vec! {doc! { 24 "type": "vector", 25 "path": "plot_embedding", 26 "numDimensions": 1536, 27 "similarity": "dotProduct" 28 }} 29 }) 30 .name(index_name.to_string()) 31 .index_type(VectorSearch) 32 .build(); 33 34 let models = vec![search_index_def]; 35 let result = my_coll.create_search_indexes(models).await; 36 if let Err(e) = result { 37 eprintln!("There was an error creating the search index: {}", e); 38 std::process::exit(1) 39 } else { 40 println!("New search index named {} is building.", result.unwrap().index(0)); 41 } 42 43 // Polling for the index to become queryable 44 println!("Polling to check if the index is ready. This may take up to a minute."); 45 let mut is_index_queryable = false; 46 while !is_index_queryable { 47 // List the search indexes 48 let mut search_indexes = my_coll.list_search_indexes().await.unwrap(); 49 // Check if the index is present and queryable 50 while let Some(index) = search_indexes.try_next().await.unwrap() { 51 let retrieved_name = index.get_str("name"); 52 if retrieved_name.unwrap().to_string() == index_name { 53 is_index_queryable = index.get_bool("queryable").unwrap(); 54 } 55 } 56 if !is_index_queryable { 57 sleep(Duration::from_secs(5)).await; // Wait for 5 seconds before polling again 58 } 59 } 60 println!("{} is ready for querying.", index_name); 61 } vector_index.rs1 use std::ops::Index; 2 use std::time::Duration; 3 use std::thread::sleep; 4 use mongodb::{ 5 bson::{doc, Document}, 6 Client, Collection, SearchIndexModel, 7 }; 8 use mongodb::options::ClientOptions; 9 use mongodb::SearchIndexType::VectorSearch; 10 11 pub(crate) fn vector_index() { 12 // Replace the placeholder with your Atlas connection string 13 let uri = "<connection_string>"; 14 15 // Create a new client and connect to the server 16 let options = ClientOptions::parse(uri).run().unwrap(); 17 let client = Client::with_options(options).unwrap(); 18 19 // Get a handle on the movies collection 20 let database = client.database("sample_mflix"); 21 let my_coll: Collection<Document> = database.collection("embedded_movies"); 22 23 let index_name = "vector_index"; 24 let search_index_def = SearchIndexModel::builder() 25 .definition(doc! { 26 "fields": vec! {doc! { 27 "type": "vector", 28 "path": "plot_embedding", 29 "numDimensions": 1536, 30 "similarity": "dotProduct" 31 }} 32 }) 33 .name(index_name.to_string()) 34 .index_type(VectorSearch) 35 .build(); 36 37 let models = vec![search_index_def]; 38 let result = my_coll.create_search_indexes(models).run(); 39 if let Err(e) = result { 40 eprintln!("There was an error creating the search index: {}", e); 41 std::process::exit(1) 42 } else { 43 println!("New search index named {} is building.", result.unwrap().index(0)); 44 } 45 46 // Polling for the index to become queryable 47 println!("Polling to check if the index is ready. This may take up to a minute."); 48 let mut is_index_queryable = false; 49 while !is_index_queryable { 50 // List the search indexes 51 let search_indexes = my_coll.list_search_indexes().run().unwrap(); 52 53 // Check if the index is present and queryable 54 for index in search_indexes { 55 let unwrapped_index = index.unwrap(); 56 let retrieved_name = unwrapped_index.get_str("name").unwrap(); 57 if retrieved_name == index_name { 58 is_index_queryable = unwrapped_index.get_bool("queryable").unwrap_or(false); 59 } 60 } 61 62 if !is_index_queryable { 63 sleep(Duration::from_secs(5)); // Wait for 5 seconds before polling again 64 } 65 } 66 println!("{} is ready for querying.", index_name); 67 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true main.rs
から関数を呼び出します。mod vector_index; fn main() { vector_index::vector_index(); } IDE でファイルを実行するか、コマンドラインからコマンドを実行してコードを実行します。
cargo run New search index named vector_index is building. Polling to check if the index is ready. This may take up to a minute. vector_index is ready for querying.
MongoDB Scala ドライバーをインストールします。
環境と使用している Scala のバージョンに基づいてインストール手順について詳しくは、「 MongoDB Scala ドライバーのドキュメント 」を参照してください。
通常、使用するツールを使用して新しいScalaプロジェクトを作成します。この簡単な開始のために、
quick-start
sdb を使用して という名前のプロジェクトを作成します。sbt new scala/hello-world.g8 プロンプトが表示されたら、アプリケーションに
quick-start
という名前を付けます。quick-start
プロジェクトに移動し、VectorIndex.scala
という名前のファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。VectorIndex.scala1 import org.mongodb.scala._ 2 import org.mongodb.scala.model._ 3 import com.mongodb.client.model.SearchIndexType 4 5 class VectorIndex { 6 def createIndex(): Unit = { 7 val collection = 8 MongoClient("<connection-string>") 9 .getDatabase("sample_mflix") 10 .getCollection("embedded_movies") 11 val indexName = "vector_index" 12 val indexNameAsOption = Option(indexName) 13 val indexDefinition = Document( 14 "fields" -> List( 15 Document( 16 "type" -> "vector", 17 "path" -> "plot_embedding", 18 "numDimensions" -> 1536, 19 "similarity" -> "dotProduct" 20 ) 21 ) 22 ) 23 val indexType = Option(SearchIndexType.vectorSearch()) 24 val indexModel: SearchIndexModel = SearchIndexModel( 25 indexNameAsOption, indexDefinition, indexType 26 ) 27 collection.createSearchIndexes(List(indexModel)).foreach { doc => println(s"New search index named $doc is building.") } 28 Thread.sleep(2000) 29 println("Polling to check if the index is ready. This may take up to a minute.") 30 var indexReady = false 31 while (!indexReady) { 32 val searchIndexes = collection.listSearchIndexes() 33 searchIndexes.foreach { current => 34 val document = current.toBsonDocument() 35 val name = document.get("name").asString().getValue 36 val queryable = document.get("queryable").asBoolean().getValue 37 if (name == indexName && queryable) { 38 indexReady = true 39 } 40 } 41 if (!indexReady) { 42 Thread.sleep(5000) 43 } 44 } 45 println(s"$indexName is ready for querying.") 46 } 47 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true クラスインスタンスを作成し、プロジェクトの
Main.scala
ファイルで関数を呼び出します。object Main extends App { private val indexInstance = new VectorIndex indexInstance.createIndex() } IDE でファイルを実行するか、コマンドラインからコマンドを実行してコードを実行します。
Scala が実行されるツールと環境は多数あります。 この例では、 コマンドで sbt
sbt
サーバーを起動し、 と入力して、新しい Scala~run
プロジェクトを実行します。sbt:quick-start> ~run New search index named vector_index is building. Polling to check if the index is ready. This may take up to a minute. vector_index is ready for querying.
依存関係をインストールします。
詳細な手順については、「前提条件 」を参照してください。
Homebrew を使用する場合は、ターミナルで次のコマンドを実行できます。
brew install mongodb-atlas-cli その他のオペレーティング システムへのインストール手順については、「 Atlas CLI のインストール 」を参照してください。
Docker では、MongoDB イメージをプルしてキャッシュするためにネットワーク接続が必要です。
MacOS または Windows の場合は、 Docker Desktop v4.31 + をインストールします。
Linux の場合は、 Docker Engine v27.0 + をインストールします。
Atlas のローカル配置を設定します。
Atlas アカウントをお持ちでない場合は、ターミナルで
atlas setup
を実行するか、新しいアカウントを作成してください。atlas deployments setup
を実行し、プロンプトに従ってローカル配置を作成します。 配置への接続を求められたら、skip
を選択します。詳細な手順については、「ローカル Atlas 配置の作成 」を参照してください。
ベクトル検索 インデックスを作成します。
次のファイルを作成します:
vector-index.json
次のインデックス定義をコピーして、 JSONファイルに貼り付けます。
{ "database": "sample_mflix", "collectionName": "embedded_movies", "type": "vectorSearch", "name": "vector_index", "fields": [ { "type": "vector", "path": "plot_embedding", "numDimensions": 1536, "similarity": "dotProduct" } ] } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
ファイルを保存し、ターミナルで次のコマンドを実行して、
<path-to-file>
を作成したvector-index.json
ファイルへのパスに置き換えます。atlas deployments search indexes create --file <path-to-file>
mongosh
を使用して Atlas クラスターに接続します。ターミナル ウィンドウで
atlas deployments connect
を実行し、プロンプトに従って、mongosh
経由で Atlas のローカル配置に接続します。 接続の詳細な手順については、「 Atlas 配置のローカル配置の管理 」を参照してください。インデックスを作成するコレクションを含むデータベースに切り替えます。
例
use sample_mflix switched to db sample_mflix db.collection.createSearchIndex()
メソッドを実行します。1 db.embedded_movies.createSearchIndex( 2 "vector_index", 3 "vectorSearch", 4 { 5 "fields": [ 6 { 7 "type": "vector", 8 "path": "plot_embedding", 9 "numDimensions": 1536, 10 "similarity": "dotProduct" 11 } 12 ] 13 } 14 ); このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
MongoDB C ドライバーをインストールします。
インストール手順の詳細については、 MongoDB C ドライバー のドキュメントを参照してください。
query-quick-start
という新しいディレクトリを作成します。mkdir query-quick-start ディレクトリを入力し、
CMakeLists.txt
ファイルを作成します。cd query-quick-start touch CMakeLists.txt 以下の行をコピーして、
CMakeLists.txt
ファイルに貼り付けます。cmake_minimum_required(VERSION 3.30) project(atlas-vector-search-quick-start) # Specify the minimum version for creating a vector index. find_package (mongoc-1.0 1.28.0 REQUIRED) add_executable(atlas-vector-search-quick-start vector_index.c ) target_link_libraries (atlas-vector-search-quick-start PRIVATE mongo::mongoc_shared) インデックスを定義します。
vector_index.c
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。vector_index.c1 2 3 4 5 int main(void) { 6 mongoc_client_t *client; 7 mongoc_collection_t *collection; 8 bson_error_t error; 9 char database_name[] = "sample_mflix"; 10 char collection_name[] = "embedded_movies"; 11 char index_name[] = "vector_index"; 12 13 mongoc_init(); 14 15 // Replace the placeholder with your Atlas connection string 16 client = mongoc_client_new("<connection-string>"); 17 18 // Connect to your Atlas cluster 19 collection = mongoc_client_get_collection (client, database_name, collection_name); 20 21 bson_t cmd; 22 // Create search index command. 23 { 24 char *cmd_str = bson_strdup_printf ( 25 BSON_STR ({ 26 "createSearchIndexes" : "%s", 27 "indexes" : [{ 28 "definition": { 29 "fields": [{ 30 "type": "vector", 31 "path": "plot_embedding", 32 "numDimensions": 1536, 33 "similarity": "dotProduct" 34 }] 35 }, 36 "name": "%s", 37 "type": "vectorSearch" 38 }] 39 }), 40 collection_name, index_name); 41 if (!bson_init_from_json(&cmd, cmd_str, -1, &error)) { 42 printf("Failed to initialize BSON: %s\n", error.message); 43 bson_free(cmd_str); 44 return 1; 45 } 46 bson_free (cmd_str); 47 } 48 if (!mongoc_collection_command_simple (collection, &cmd, NULL /* read_prefs */, NULL /* reply */, &error)) { 49 bson_destroy (&cmd); 50 printf ("Failed to run createSearchIndexes: %s", error.message); 51 return 1; 52 } else { 53 printf ("New search index named %s is building.\n", index_name); 54 bson_destroy (&cmd); 55 } 56 57 // Polling for index status 58 printf("Polling to check if the index is ready. This may take up to a minute.\n"); 59 int queryable = 0; 60 while (!queryable) { 61 const char *pipeline_str = "{\"pipeline\": [{\"$listSearchIndexes\": {}}]}"; 62 bson_t pipeline; 63 if (!bson_init_from_json(&pipeline, pipeline_str, -1, &error)) { 64 printf("Failed to initialize pipeline BSON: %s\n", error.message); 65 break; // Exit the loop on error 66 } 67 mongoc_cursor_t *cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, &pipeline, NULL, NULL); 68 const bson_t *got; 69 // Check if the cursor returns any documents 70 int found_index = 0; 71 while (mongoc_cursor_next(cursor, &got)) { 72 bson_iter_t iter; 73 if (bson_iter_init(&iter, got) && bson_iter_find(&iter, "name")) { 74 const char *name = bson_iter_utf8(&iter, NULL); 75 if (strcmp(name, index_name) == 0) { 76 found_index = 1; // Index found 77 bson_iter_find(&iter, "queryable"); 78 queryable = bson_iter_bool(&iter); 79 break; // Exit the loop since we found the index 80 } 81 } 82 } 83 if (mongoc_cursor_error(cursor, &error)) { 84 printf("Failed to run $listSearchIndexes: %s\n", error.message); 85 break; // Exit the loop on error 86 } 87 if (!found_index) { 88 printf("Index %s not found yet. Retrying...\n", index_name); 89 } 90 bson_destroy(&pipeline); 91 mongoc_cursor_destroy(cursor); 92 sleep(5); // Sleep for 5 seconds before checking again 93 } 94 if (queryable) { 95 printf("%s is ready for querying.\n", index_name); 96 } else { 97 printf("Error occurred or index not found.\n"); 98 } 99 100 // Cleanup 101 mongoc_collection_destroy(collection); 102 mongoc_client_destroy(client); 103 mongoc_cleanup(); 104 105 return 0; 106 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true /build
ディレクトリを作成して入力します。mkdir build && cd build プロジェクトを準備します。
cmake ../ アプリをビルドします。
cmake --build . アプリを実行してインデックスを作成します。
./atlas-vector-search-quick-start 1 New search index named vector_index is building. 2 Polling to check if the index is ready. This may take up to a minute. 3 vector_index is ready for querying.
MongoDB C++ドライバーをインストールします。
インストール手順の詳細については、 MongoDB C++ドライバーのドキュメント を参照してください。
query-quick-start
という新しいディレクトリを作成します。mkdir query-quick-start ディレクトリを入力し、
CMakeLists.txt
ファイルを作成します。cd query-quick-start touch CMakeLists.txt 以下の行をコピーして、
CMakeLists.txt
ファイルに貼り付けます。cmake_minimum_required(VERSION 3.30) project(query_quick_start) set(CMAKE_CXX_STANDARD 17) # Specify the minimum version for creating a vector index. find_package(mongocxx 3.11.0 REQUIRED) find_package(bsoncxx REQUIRED) add_executable(query_quick_start vector_index.cpp ) target_link_libraries(query_quick_start PRIVATE mongo::mongocxx_shared) target_link_libraries(query_quick_start PRIVATE mongo::bsoncxx_shared) インデックスを定義します。
vector_index.cpp
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。vector_index.cpp1 2 3 4 5 6 7 8 9 using bsoncxx::builder::basic::kvp; 10 using bsoncxx::builder::basic::make_array; 11 using bsoncxx::builder::basic::make_document; 12 13 int main() { 14 try { 15 mongocxx::instance inst{}; 16 17 // Replace the placeholder with your Atlas connection string 18 const auto uri = mongocxx::uri{"<connection-string>"}; 19 20 // Connect to your Atlas cluster 21 mongocxx::client conn{uri}; 22 auto db = conn["sample_mflix"]; 23 auto collection = db["embedded_movies"]; 24 25 auto siv = collection.search_indexes(); 26 std::string name = "vector_index"; 27 auto type = "vectorSearch"; 28 auto definition = make_document( 29 kvp("fields", 30 make_array(make_document( 31 kvp("type", "vector"), kvp("path", "plot_embedding"), 32 kvp("numDimensions", 1536), kvp("similarity", "dotProduct"))))); 33 auto model = 34 mongocxx::search_index_model(name, definition.view()).type(type); 35 siv.create_one(model); 36 std::cout << "New search index named " << name << " is building." 37 << std::endl; 38 39 // Polling for index status 40 std::cout << "Polling to check if the index is ready. This may take up to " 41 "a minute." 42 << std::endl; 43 bool queryable = false; 44 while (!queryable) { 45 auto indexes = siv.list(); 46 for (const auto& index : indexes) { 47 if (index["name"].get_value() == name) { 48 queryable = index["queryable"].get_bool(); 49 } 50 } 51 if (!queryable) { 52 std::this_thread::sleep_for(std::chrono::seconds(5)); 53 } 54 } 55 std::cout << name << " is ready for querying." << std::endl; 56 } catch (const std::exception& e) { 57 std::cout << "Exception: " << e.what() << std::endl; 58 } 59 return 0; 60 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true /build
ディレクトリを作成して入力します。mkdir build && cd build プロジェクトを準備します。
cmake ../ アプリをビルドします。
cmake --build . アプリを実行してインデックスを作成します。
./query_quick_start 1 New search index named vector_index is building. 2 Polling to check if the index is ready. This may take up to a minute. 3 vector_index is ready for querying.
次のファイルを作成します:
vector-index.json
次のインデックス定義をコピーして、JSON ファイルに貼り付けます。
{ "database": "sample_mflix", "collectionName": "embedded_movies", "type": "vectorSearch", "name": "vector_index", "fields": [ { "type": "vector", "path": "plot_embedding", "numDimensions": 1536, "similarity": "dotProduct" } ] } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
ファイルを保存し、ターミナルで次のコマンドを実行して、
<path-to-file>
を作成したvector-index.json
ファイルへのパスに置き換えます。atlas deployments search indexes create --file <path-to-file>
Go モジュールを初期化します。
mkdir go-vector-quickstart && cd go-vector-quickstart go mod init go-vector-quickstart Go ドライバーを依存関係としてプロジェクトに追加します。
go get go.mongodb.org/mongo-driver/mongo インストール手順の詳細については、 MongoDB Go ドライバーのドキュメント を参照してください。
インデックスを定義します。
vector-index.go
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。vector-index.go1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "log" 7 "time" 8 9 "go.mongodb.org/mongo-driver/bson" 10 "go.mongodb.org/mongo-driver/mongo" 11 "go.mongodb.org/mongo-driver/mongo/options" 12 ) 13 14 func main() { 15 ctx := context.Background() 16 17 // Replace the placeholder with your Atlas connection string 18 const uri = "<connectionString>" 19 20 // Connect to your Atlas cluster 21 clientOptions := options.Client().ApplyURI(uri) 22 client, err := mongo.Connect(ctx, clientOptions) 23 if err != nil { 24 log.Fatalf("failed to connect to the server: %v", err) 25 } 26 defer func() { _ = client.Disconnect(ctx) }() 27 28 // Set the namespace 29 coll := client.Database("sample_mflix").Collection("embedded_movies") 30 31 // Define the index details 32 type vectorDefinitionField struct { 33 Type string `bson:"type"` 34 Path string `bson:"path"` 35 NumDimensions int `bson:"numDimensions"` 36 Similarity string `bson:"similarity"` 37 } 38 39 type vectorDefinition struct { 40 Fields []vectorDefinitionField `bson:"fields"` 41 } 42 43 indexName := "vector_index" 44 opts := options.SearchIndexes().SetName(indexName).SetType("vectorSearch") 45 46 indexModel := mongo.SearchIndexModel{ 47 Definition: vectorDefinition{ 48 Fields: []vectorDefinitionField{{ 49 Type: "vector", 50 Path: "plot_embedding", 51 NumDimensions: 1536, 52 Similarity: "dotProduct"}}, 53 }, 54 Options: opts, 55 } 56 57 // Create the index 58 searchIndexName, err := coll.SearchIndexes().CreateOne(ctx, indexModel) 59 if err != nil { 60 log.Fatalf("failed to create the search index: %v", err) 61 } 62 log.Println("New search index named " + searchIndexName + " is building.") 63 64 // Await the creation of the index. 65 log.Println("Polling to check if the index is ready. This may take up to a minute.") 66 searchIndexes := coll.SearchIndexes() 67 var doc bson.Raw 68 for doc == nil { 69 cursor, err := searchIndexes.List(ctx, options.SearchIndexes().SetName(searchIndexName)) 70 if err != nil { 71 fmt.Errorf("failed to list search indexes: %w", err) 72 } 73 74 if !cursor.Next(ctx) { 75 break 76 } 77 78 name := cursor.Current.Lookup("name").StringValue() 79 queryable := cursor.Current.Lookup("queryable").Boolean() 80 if name == searchIndexName && queryable { 81 doc = cursor.Current 82 } else { 83 time.Sleep(5 * time.Second) 84 } 85 } 86 87 log.Println(searchIndexName + " is ready for querying.") 88 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true 以下のコマンドを実行してインデックスを作成します。
go run vector-index.go 2024/10/17 09:38:21 New search index named vector_index is building. 2024/10/17 09:38:22 Polling to check if the index is ready. This may take up to a minute. 2024/10/17 09:38:48 vector_index is ready for querying.
Java ドライバーバージョン 5.2 以降を依存関係としてプロジェクトに追加します。
Maven を使用している場合は、
pom.xml
依存関係リストに次の依存関係を追加してください。<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>[5.2.0,)</version> </dependency> Gradle を使用している場合は、次の依存関係を
build.gradle
依存関係リストに追加します。dependencies { implementation 'org.mongodb:mongodb-driver-sync:[5.2.0,)' }
Java ドライバー JAR ファイルを
CLASSPATH
に追加します。詳しいインストール手順やバージョンの互換性については MongoDB Java Driver のドキュメントを参照ください。
VectorIndex.java
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。VectorIndex.java1 import com.mongodb.client.ListSearchIndexesIterable; 2 import com.mongodb.client.MongoClient; 3 import com.mongodb.client.MongoClients; 4 import com.mongodb.client.MongoCollection; 5 import com.mongodb.client.MongoCursor; 6 import com.mongodb.client.MongoDatabase; 7 import com.mongodb.client.model.SearchIndexModel; 8 import com.mongodb.client.model.SearchIndexType; 9 import org.bson.Document; 10 import org.bson.conversions.Bson; 11 12 import java.util.Collections; 13 import java.util.List; 14 15 public class VectorIndex { 16 17 public static void main(String[] args) { 18 19 // Replace the placeholder with your Atlas connection string 20 String uri = "<connectionString>"; 21 22 // Connect to your Atlas cluster 23 try (MongoClient mongoClient = MongoClients.create(uri)) { 24 25 // Set the namespace 26 MongoDatabase database = mongoClient.getDatabase("sample_mflix"); 27 MongoCollection<Document> collection = database.getCollection("embedded_movies"); 28 29 // Define the index details 30 String indexName = "vector_index"; 31 Bson definition = new Document( 32 "fields", 33 Collections.singletonList( 34 new Document("type", "vector") 35 .append("path", "plot_embedding") 36 .append("numDimensions", 1536) 37 .append("similarity", "dotProduct"))); 38 39 // Define the index model 40 SearchIndexModel indexModel = new SearchIndexModel( 41 indexName, 42 definition, 43 SearchIndexType.vectorSearch()); 44 45 // Create the index 46 try { 47 List<String> result = collection.createSearchIndexes(Collections.singletonList(indexModel)); 48 System.out.println("New search index named " + result.get(0) + " is building."); 49 } catch (Exception e) { 50 throw new RuntimeException("Error creating index: " + e); 51 } 52 53 // Wait for Atlas to build the index 54 System.out.println("Polling to check if the index is ready. This may take up to a minute."); 55 56 ListSearchIndexesIterable<Document> searchIndexes = collection.listSearchIndexes(); 57 Document doc = null; 58 while (doc == null) { 59 try (MongoCursor<Document> cursor = searchIndexes.iterator()) { 60 if (!cursor.hasNext()) { 61 break; 62 } 63 Document current = cursor.next(); 64 String name = current.getString("name"); 65 // When the index completes building, it becomes `queryable` 66 boolean queryable = current.getBoolean("queryable"); 67 if (name.equals(indexName) && queryable) { 68 doc = current; 69 } else { 70 Thread.sleep(500); 71 } 72 } catch (Exception e) { 73 throw new RuntimeException("Failed to list search indexes: " + e); 74 } 75 } 76 System.out.println(indexName + " is ready for querying."); 77 78 } catch (Exception e) { 79 throw new RuntimeException("Error connecting to MongoDB: " + e); 80 } 81 } 82 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true IDE でファイルを実行するか、コマンドラインからコマンドを実行してコードを実行します。
javac VectorIndex.java java VectorIndex New search index named vector_index is building. Polling to check if the index is ready. This may take up to a minute. vector_index is ready for querying.
MongoDB Kotlin コルーチン ドライバーをインストールします。
より詳細なインストール手順とバージョンの互換性については、「MongoDB Kotlin コルーチン ドライバーのドキュメント」を参照してください。
インデックスを定義します。
VectorIndex.kt
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。VectorIndex.kt1 import com.mongodb.MongoException 2 import com.mongodb.client.model.SearchIndexModel 3 import com.mongodb.client.model.SearchIndexType 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.delay 6 import kotlinx.coroutines.flow.toList 7 import org.bson.Document 8 import kotlinx.coroutines.runBlocking 9 10 fun main() { 11 // Replace the placeholder with your MongoDB deployment's connection string 12 val uri = "<connection-string>" 13 val mongoClient = MongoClient.create(uri) 14 val database = mongoClient.getDatabase("sample_mflix") 15 val collection = database.getCollection<Document>("embedded_movies") 16 val indexName = "vector_index" 17 val searchIndexModel = SearchIndexModel( 18 indexName, 19 Document( 20 "fields", 21 listOf( 22 Document("type", "vector") 23 .append("path", "plot_embedding") 24 .append("numDimensions", 1536) 25 .append("similarity", "dotProduct") 26 ) 27 ), 28 SearchIndexType.vectorSearch() 29 ) 30 31 runBlocking { 32 try { 33 collection.createSearchIndexes(listOf(searchIndexModel)) 34 .collect { result -> 35 println("New search index named $result is building.") 36 } 37 38 // Polling to check if the index is queryable 39 println("Polling to check if the index is ready. This may take up to a minute.") 40 var isQueryable = false 41 while (!isQueryable) { 42 delay(5000L) // Poll every 5 seconds 43 44 val indexes = collection.listSearchIndexes().toList() 45 isQueryable = indexes.any { index -> 46 index.getString("name") == indexName && index.getBoolean("queryable") 47 } 48 if (isQueryable) { 49 println("$indexName is ready for querying.") 50 } 51 } 52 } catch (me: MongoException) { 53 System.err.println("An error occurred: $me") 54 } 55 } 56 mongoClient.close() 57 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true IDE で
VectorIndex.kt
ファイルを実行します。 出力は、次のようになります。New search index named vector_index is building. Polling to check if the index is ready. This may take up to a minute. vector_index is ready for querying.
MongoDB Kotlin Sync ドライバーをインストールします。
より詳細なインストール手順とバージョンの互換性については、「MongoDB Kotlin Sync ドライバーのドキュメント」を参照してください。
インデックスを定義します。
VectorIndex.kt
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。VectorIndex.kt1 import com.mongodb.MongoException 2 import com.mongodb.client.model.SearchIndexModel 3 import com.mongodb.client.model.SearchIndexType 4 import com.mongodb.kotlin.client.MongoClient 5 import org.bson.Document 6 7 fun main() { 8 // Replace the placeholder with your MongoDB deployment's connection string 9 val uri = "<connection-string>" 10 val mongoClient = MongoClient.create(uri) 11 val database = mongoClient.getDatabase("sample_mflix") 12 val collection = database.getCollection<Document>("embedded_movies") 13 val indexName = "vector_index" 14 val searchIndexModel = SearchIndexModel( 15 indexName, 16 Document( 17 "fields", 18 listOf( 19 Document("type", "vector") 20 .append("path", "plot_embedding") 21 .append("numDimensions", 1536) 22 .append("similarity", "dotProduct") 23 ) 24 ), 25 SearchIndexType.vectorSearch() 26 ) 27 28 try { 29 val result = collection.createSearchIndexes( 30 listOf(searchIndexModel) 31 ) 32 println("New search index named ${result.get(0)} is building.") 33 34 // Polling to check if the index is queryable 35 println("Polling to check if the index is ready. This may take up to a minute.") 36 var isQueryable = false 37 while (!isQueryable) { 38 val results = collection.listSearchIndexes() 39 results.forEach { result -> 40 if (result.getString("name") == indexName && result.getBoolean("queryable")) { 41 println("$indexName is ready for querying.") 42 isQueryable = true 43 } else { 44 Thread.sleep(5000) // Poll every 5 seconds 45 } 46 } 47 } 48 } catch (me: MongoException) { 49 System.err.println("An error occurred: $me") 50 } 51 mongoClient.close() 52 } このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定します。
このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。
<connection-string>
を指定します。<connection-string>
を Atlas クラスターまたはローカル配置の接続文字列に置き換え、ファイルを保存します。接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net 注意
接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 接続stringの検索方法について詳しくは、「ドライバー経由で接続 」を参照してください。
接続stringには、次の形式を使用する必要があります。
mongodb://localhost:<port-number>/?directConnection=true IDE で
VectorIndex.kt
ファイルを実行します。 出力は、次のようになります。New search index named vector_index is building. Polling to check if the index is ready. This may take up to a minute. vector_index is ready for querying.
MongoDB Node ドライバーを依存関係としてプロジェクトに追加します。
npm install mongodb Tip
このページの例では、プロジェクトが CommonJS モジュールとしてモジュールを管理することを前提としています。ES モジュールを使用している場合は、代わりにインポート構文を変更する必要があります。
インデックスを定義します。
vector-index.js
というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。vector-index.js1 const { MongoClient } = require("mongodb"); 2 3 // connect to your Atlas deployment 4 const uri = "<connectionString>"; 5 6 const client = new MongoClient(uri); 7 8 async function run() { 9 try { 10 const database = client.db("sample_mflix"); 11 const collection = database.collection("embedded_movies"); 12 13 // define your Atlas Vector Search index 14 const index = { 15 name: "vector_index", 16 type: "vectorSearch", 17 definition: { 18 "fields": [ 19 { 20 "type": "vector", 21 "numDimensions": 1536, 22 "path": "plot_embedding", 23 "similarity": "dotProduct" 24 } 25 ] 26 } 27 } 28 29 // run the helper method 30 const result = await collection.createSearchIndex(index); 31 console.log(`New search index named ${result} is building.`); 32 33 // wait for the index to be ready to query 34 console.log("Polling to check if the index is ready. This may take up to a minute.") 35 let isQueryable = false; 36 while (!isQueryable) { 37 const cursor = collection.listSearchIndexes(); 38 for await (const index of cursor) { 39 if (index.name === result) { 40 if (index.queryable) { 41 console.log(`${result} is ready for querying.`); 42 isQueryable = true; 43 } else { 44 await new Promise(resolve => setTimeout(resolve, 5000)); 45 } 46 } 47 } 48 } 49 } finally { 50 await client.close(); 51 } 52 } 53 run().catch(console.dir); このインデックス定義:
plot_embedding
フィールドをvector
タイプとしてインデックス化します。 このフィールドには、映画のプロットの概要を表すベクトル埋め込みが含まれています。1536
ベクトル次元を指定します。dotProduct
類似性を使用して類似性を測定