Docs Menu
Docs Home
/
MongoDB Atlas
/

Atlas Vector Search クイック スタート

項目一覧

  • 目的
  • ベクトル検索インデックスの作成
  • ベクトル検索クエリの実行
  • 学習の概要
  • 次のステップ

このクイック スタートでは、ベクトル埋め込みを含むサンプルドキュメントを Atlas クラスターまたはローカル Atlas 配置にロードし、それらの埋め込みに Atlas Vector Search インデックスを作成し、セマンティック検索を実行してクエリに似たドキュメントを返す方法について説明します。

所要時間: 15 分

このクイック スタートでは、次の手順を実行します。

  1. plot_embedding フィールドを vector 型としてインデックスする sample_mflix.embedded_movies コレクションのインデックス定義を作成します。plot_embedding フィールドには、OpenAI の text-embedding-ada-002 埋め込みモデルを使用して作成された埋め込みが含まれます。インデックス定義では 1536 ベクトル次元を指定し、dotProduct を使用して類似性を測定します。

  2. サンプル sample_mflix.embedded_movies コレクションを検索する Atlas Vector Search クエリを実行します。クエリは、 $vectorSearch ステージを使用して plot_embedding フィールドを検索します。このフィールドには OpenAI の text-embedding-ada-002 埋め込みモデルを使用して作成された埋め込みが含まれます。このクエリは、ベクトル埋め込みを使用して plot_embedding フィールドでタイムトラベルという文字列を検索します。最大 150 の最近傍を考慮し、結果として 10 ドキュメントを返します。

詳細については、「 ラーニングの概要」を参照してください。


➤ このページの例を実行するために使用するクライアントを設定するには、右側のナビゲーション ペインにある [言語を選択] ドロップダウン メニューを使用します。


このセクションでは、Atlas クラスターまたはローカル コンピューターでホストされている配置にロードするサンプル データに Atlas Vector Search インデックスを作成します。

1
  1. 無料の Atlas アカウントを作成するか、既存のアカウントにサインインします。

  2. Atlas クラスターがまだない場合は、 無料の M 0クラスターを作成します。 Atlas クラスターの作成の詳細については、「 クラスターの作成 」を参照してください。

    注意

    既存のクラスターを使用している場合は、Atlas プロジェクトへのProject Data Access Admin以上のアクセス権が必要です。

    新しいクラスターを作成する場合は、必要な権限がデフォルトで付与されます。

    プロジェクトごとに作成できる M0 無料クラスターは 1 つだけです。

  3. 左側のサイドバーで、[ Atlas Search ] をクリックします。 Select data sourceメニューからクラスターを選択し、 Go to Atlas Searchをクリックします。

  4. サンプルデータセットをまだクラスターにロードしていない場合は、[Load a Sample Dataset] をクリックします。[Load Sample Dataset] ダイアログボックスで、[Load Sample Dataset] をクリックして確定します。

    サンプルデータセットをすでに読み込んでいる場合は、sample_mflix データベースに embedded_movies コレクションが含まれていることを確認します。含まれていない場合は、サンプルデータベースを削除し、サンプルデータセットを再読み込みします。

    サンプル データセットのロードが完了するまでに数分かかる場合があります。

2

注意

mongoshコマンドまたはドライバーヘルパーメソッドを使用して、すべての Atlas クラスター階層に Atlas Search インデックスを作成できます。サポートされているドライバー バージョンのリストについては、 「サポートされているクライアント」 を参照してください。

  1. サンプル データの読み込みが完了したら、 Create Search Indexをクリックします。

  2. セクションで、 Atlas Vector Searchを選択し、JSON Editor をクリックします。Next

  3. Database and Collectionセクションで、 sample_mflixデータベースを展開し、 embedded_moviesコレクションを選択します。

    この コレクション の各 ドキュメント には、stringplot_embedding としての映画のプロットの概要を含む、映画に関する情報が含まれています。これはまた、ドキュメントの フィールドに変換され、ベクトル埋め込みとして保存されています。

  4. Index Nameフィールドにvector_indexを指定します。

  5. 次のベクトル検索インデックスの定義をコピーして JSON エディターに貼り付けます。

    1{
    2 "fields": [{
    3 "type": "vector",
    4 "path": "plot_embedding",
    5 "numDimensions": 1536,
    6 "similarity": "dotProduct"
    7 }]
    8}

    このインデックス定義:

  6. [Next] をクリックします。

  7. [Create Search Index] をクリックします。

    インデックスの構築には約 1 分かかります。 ベクトル インデックスの作成が完了すると、 Status列にはActiveが読み取られます。

  1. mongosh を使用して Atlas クラスターに接続します。

    ターミナル ウィンドウでmongoshを開き、Atlas クラスターに接続します。 接続の詳細な手順については、「 mongosh 経由での接続 」を参照してください。

  2. インデックスを作成するコレクションを含むデータベースに切り替えます。

    use sample_mflix
    switched to db sample_mflix
  3. db.collection.createSearchIndex()メソッドを実行します。

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

    このインデックス定義:

  1. MongoDB C ドライバーをインストールします。

    インストール手順の詳細については、 MongoDB C ドライバー のドキュメントを参照してください。

  2. query-quick-startという新しいディレクトリを作成します。

    mkdir query-quick-start
  3. ディレクトリを入力し、 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)
  4. インデックスを定義します。

    vector_index.c というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    vector_index.c
    1#include <bson/bson.h>
    2#include <mongoc/mongoc.h>
    3#include <stdio.h>
    4
    5int 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}

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  5. <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
  6. /buildディレクトリを作成して入力します。

    mkdir build && cd build
  7. プロジェクトを準備します。

    cmake ../
  8. アプリをビルドします。

    cmake --build .
  9. アプリを実行してインデックスを作成します。

    ./atlas-vector-search-quick-start
    1New search index named vector_index is building.
    2Polling to check if the index is ready. This may take up to a minute.
    3vector_index is ready for querying.
  1. MongoDB C++ドライバーをインストールします。

    インストール手順の詳細については、 MongoDB C++ドライバーのドキュメント を参照してください。

  2. query-quick-startという新しいディレクトリを作成します。

    mkdir query-quick-start
  3. ディレクトリを入力し、 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)
  4. インデックスを定義します。

    vector_index.cpp というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    vector_index.cpp
    1#include <bsoncxx/builder/basic/document.hpp>
    2#include <iostream>
    3#include <mongocxx/client.hpp>
    4#include <mongocxx/instance.hpp>
    5#include <mongocxx/search_index_view.hpp>
    6#include <mongocxx/uri.hpp>
    7#include <thread>
    8
    9using bsoncxx::builder::basic::kvp;
    10using bsoncxx::builder::basic::make_array;
    11using bsoncxx::builder::basic::make_document;
    12
    13int 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}

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  5. <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
  6. /buildディレクトリを作成して入力します。

    mkdir build && cd build
  7. プロジェクトを準備します。

    cmake ../
  8. アプリをビルドします。

    cmake --build .
  9. アプリを実行してインデックスを作成します。

    ./query_quick_start
    1New search index named vector_index is building.
    2Polling to check if the index is ready. This may take up to a minute.
    3vector_index is ready for querying.
  1. サンプル データの読み込みが完了したら、 Create Search Indexをクリックします。

  2. セクションで、 Atlas Vector Searchを選択し、JSON Editor をクリックします。Next

  3. Database and Collectionセクションで、 sample_mflixデータベースを展開し、 embedded_moviesコレクションを選択します。

    この コレクション の各 ドキュメント には、stringplot_embedding としての映画のプロットの概要を含む、映画に関する情報が含まれています。これはまた、ドキュメントの フィールドに変換され、ベクトル埋め込みとして保存されています。

  4. Index Nameフィールドにvector_indexを指定します。

  5. 次のベクトル検索インデックスの定義をコピーして JSON エディターに貼り付けます。

    1{
    2 "fields": [{
    3 "type": "vector",
    4 "path": "plot_embedding",
    5 "numDimensions": 1536,
    6 "similarity": "dotProduct"
    7 }]
    8}

    このインデックス定義:

  6. [Next] をクリックします。

  7. [Create Search Index] をクリックします。

    インデックスの構築には約 1 分かかります。 ベクトル インデックスの作成が完了すると、 Status列にはActiveが読み取られます。

  1. Go モジュールを初期化します。

    mkdir go-vector-quickstart && cd go-vector-quickstart
    go mod init go-vector-quickstart
  2. Go ドライバーを依存関係としてプロジェクトに追加します。

    go get go.mongodb.org/mongo-driver/mongo

    インストール手順の詳細については、 MongoDB Go ドライバーのドキュメント を参照してください。

  3. インデックスを定義します。

    vector-index.go というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    vector-index.go
    1package main
    2
    3import (
    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
    14func 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}

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  4. <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
  5. 以下のコマンドを実行してインデックスを作成します。

    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.
  1. 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,)'
      }
  2. Java ドライバー JAR ファイルを CLASSPATH に追加します。

    詳しいインストール手順やバージョンの互換性については MongoDB Java Driver のドキュメントを参照ください。

  3. VectorIndex.java というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    VectorIndex.java
    1import com.mongodb.client.ListSearchIndexesIterable;
    2import com.mongodb.client.MongoClient;
    3import com.mongodb.client.MongoClients;
    4import com.mongodb.client.MongoCollection;
    5import com.mongodb.client.MongoCursor;
    6import com.mongodb.client.MongoDatabase;
    7import com.mongodb.client.model.SearchIndexModel;
    8import com.mongodb.client.model.SearchIndexType;
    9import org.bson.Document;
    10import org.bson.conversions.Bson;
    11
    12import java.util.Collections;
    13import java.util.List;
    14
    15public 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}

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  4. <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
  5. 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.
  1. MongoDB Kotlin コルーチン ドライバーをインストールします。

    より詳細なインストール手順とバージョンの互換性については、「MongoDB Kotlin コルーチン ドライバーのドキュメント」を参照してください。

  2. インデックスを定義します。

    VectorIndex.kt というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    VectorIndex.kt
    1import com.mongodb.MongoException
    2import com.mongodb.client.model.SearchIndexModel
    3import com.mongodb.client.model.SearchIndexType
    4import com.mongodb.kotlin.client.coroutine.MongoClient
    5import kotlinx.coroutines.delay
    6import kotlinx.coroutines.flow.toList
    7import org.bson.Document
    8import kotlinx.coroutines.runBlocking
    9
    10fun 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}

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  3. <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
  4. 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.
  1. MongoDB Kotlin Sync ドライバーをインストールします。

    より詳細なインストール手順とバージョンの互換性については、「MongoDB Kotlin Sync ドライバーのドキュメント」を参照してください。

  2. インデックスを定義します。

    VectorIndex.kt というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    VectorIndex.kt
    1import com.mongodb.MongoException
    2import com.mongodb.client.model.SearchIndexModel
    3import com.mongodb.client.model.SearchIndexType
    4import com.mongodb.kotlin.client.MongoClient
    5import org.bson.Document
    6
    7fun 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}

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  3. <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
  4. 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.
  1. MongoDB Node ドライバーを依存関係としてプロジェクトに追加します。

    npm install mongodb

    Tip

    このページの例では、プロジェクトが CommonJS モジュールとしてモジュールを管理することを前提としています。ES モジュールを使用している場合は、代わりにインポート構文を変更する必要があります。

  2. インデックスを定義します。

    vector-index.js というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    vector-index.js
    1const { MongoClient } = require("mongodb");
    2
    3// connect to your Atlas deployment
    4const uri = "<connectionString>";
    5
    6const client = new MongoClient(uri);
    7
    8async 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}
    53run().catch(console.dir);

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  3. <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
  4. 以下のコマンドを実行してインデックスを作成します。

    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.
  1. MongoDB PHP ドライバーをインストールします。

    インストール手順の詳細については、 MongoDB PHP ライブラリのドキュメント を参照してください。

  2. インデックスを定義します。

    vector-index.php というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    vector-index.zip
    1<?php
    2
    3require '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";
    10try {
    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}
    45catch (MongoDB\Driver\Exception\Exception $e) {
    46 print 'Error creating the index: ' .$e->getMessage() .PHP_EOL;
    47}

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  3. <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
  4. 以下のコマンドを実行してインデックスを作成します。

    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.
  1. PyMongoドライバーを依存関係としてプロジェクトに追加します。

    pip install pymongo

    インストール手順の詳細については、 MongoDB Python ドライバーのドキュメント を参照してください。

  2. インデックスを定義します。

    vector-index.py というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    vector-index.py
    1from pymongo.mongo_client import MongoClient
    2from pymongo.operations import SearchIndexModel
    3import time
    4
    5# Connect to your Atlas deployment
    6uri = "<connectionString>"
    7client = MongoClient(uri)
    8
    9# Access your database and collection
    10database = client["sample_mflix"]
    11collection = database["embedded_movies"]
    12
    13# Create your index model, then create the search index
    14search_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
    29result = collection.create_search_index(model=search_index_model)
    30print("New search index named " + result + " is building.")
    31# Wait for initial sync to complete
    32print("Polling to check if the index is ready. This may take up to a minute.")
    33predicate=None
    34if predicate is None:
    35 predicate = lambda index: index.get("queryable") is True
    36
    37while True:
    38 indices = list(collection.list_search_indexes(name))
    39 if len(indices) and predicate(indices[0]):
    40 break
    41 time.sleep(5)
    42print(result + " is ready for querying.")
    43
    44client.close()

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  3. <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
  4. 以下のコマンドを実行してインデックスを作成します。

    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.
  1. サンプル データの読み込みが完了したら、 Create Search Indexをクリックします。

  2. セクションで、 Atlas Vector Searchを選択し、JSON Editor をクリックします。Next

  3. Database and Collectionセクションで、 sample_mflixデータベースを展開し、 embedded_moviesコレクションを選択します。

    この コレクション の各 ドキュメント には、stringplot_embedding としての映画のプロットの概要を含む、映画に関する情報が含まれています。これはまた、ドキュメントの フィールドに変換され、ベクトル埋め込みとして保存されています。

  4. Index Nameフィールドにvector_indexを指定します。

  5. 次のベクトル検索インデックスの定義をコピーして JSON エディターに貼り付けます。

    1{
    2 "fields": [{
    3 "type": "vector",
    4 "path": "plot_embedding",
    5 "numDimensions": 1536,
    6 "similarity": "dotProduct"
    7 }]
    8}

    このインデックス定義:

  6. [Next] をクリックします。

  7. [Create Search Index] をクリックします。

    インデックスの構築には約 1 分かかります。 ベクトル インデックスの作成が完了すると、 Status列にはActiveが読み取られます。

  1. MongoDB 用の Rust ドライバーをインストールします。

    インストール手順の詳細については、 MongoDB Rust ドライバーのドキュメント を参照してください。

  2. インデックスを定義します。

    プロジェクトの /srcディレクトリに、 vector_index.rs という名前のファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    vector_index.rs
    1use std::ops::Index;
    2use std::time::Duration;
    3use futures::{TryStreamExt};
    4use mongodb::{bson::{Document, doc}, Client, Collection, SearchIndexModel};
    5use mongodb::SearchIndexType::VectorSearch;
    6use tokio::time::sleep;
    7
    8#[tokio::main]
    9pub(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.rs
    1use std::ops::Index;
    2use std::time::Duration;
    3use std::thread::sleep;
    4use mongodb::{
    5 bson::{doc, Document},
    6 Client, Collection, SearchIndexModel,
    7};
    8use mongodb::options::ClientOptions;
    9use mongodb::SearchIndexType::VectorSearch;
    10
    11pub(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}

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  3. <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
  4. main.rs から関数を呼び出します。

    mod vector_index;
    fn main() {
    vector_index::vector_index();
    }
  5. 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.
  1. MongoDB Scala ドライバーをインストールします。

    環境と使用している Scala のバージョンに基づいてインストール手順について詳しくは、「 MongoDB Scala ドライバーのドキュメント 」を参照してください。

  2. 通常、使用するツールを使用して新しいScalaプロジェクトを作成します。この簡単な開始のために、quick-start sdb を使用して という名前のプロジェクトを作成します。

    sbt new scala/hello-world.g8

    プロンプトが表示されたら、アプリケーションにquick-startという名前を付けます。

  3. quick-startプロジェクトに移動し、 VectorIndex.scala という名前のファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    VectorIndex.scala
    1import org.mongodb.scala._
    2import org.mongodb.scala.model._
    3import com.mongodb.client.model.SearchIndexType
    4
    5class 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}

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  4. <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
  5. クラスインスタンスを作成し、プロジェクトの Main.scalaファイルで関数を呼び出します。

    object Main extends App {
    private val indexInstance = new VectorIndex
    indexInstance.createIndex()
    }
  6. IDE でファイルを実行するか、コマンドラインからコマンドを実行してコードを実行します。

    Scala が実行されるツールと環境は多数あります。 この例では、 コマンドで sbtsbt サーバーを起動し、 と入力して、新しい 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.
1

詳細な手順については、「前提条件 」を参照してください。

  1. Atlas CLI をインストールします。

    Homebrew を使用する場合は、ターミナルで次のコマンドを実行できます。

    brew install mongodb-atlas-cli

    その他のオペレーティング システムへのインストール手順については、「 Atlas CLI のインストール 」を参照してください。

  2. Docker をインストールします。

    Docker では、MongoDB イメージをプルしてキャッシュするためにネットワーク接続が必要です。

2
  1. Atlas アカウントをお持ちでない場合は、ターミナルでatlas setupを実行するか、新しいアカウントを作成してください。

  2. atlas deployments setupを実行し、プロンプトに従ってローカル配置を作成します。 配置への接続を求められたら、 skipを選択します。

    詳細な手順については、「ローカル Atlas 配置の作成 」を参照してください。

3
  1. サンプル データをダウンロードするには、ターミナルで次のコマンドを実行します。

    curl https://atlas-education.s3.amazonaws.com/sampledata.archive -o sampledata.archive
  2. 次のコマンドを実行してデータを配置に読み込み、 <port-number>を配置をホストしているポートに置き換えます。

    mongorestore --archive=sampledata.archive --port=<port-number>
4
  1. 次のファイルを作成します: vector-index.json

  2. 次のインデックス定義をコピーして、 JSONファイルに貼り付けます。

    {
    "database": "sample_mflix",
    "collectionName": "embedded_movies",
    "type": "vectorSearch",
    "name": "vector_index",
    "fields": [
    {
    "type": "vector",
    "path": "plot_embedding",
    "numDimensions": 1536,
    "similarity": "dotProduct"
    }
    ]
    }

    このインデックス定義:

  3. ファイルを保存し、ターミナルで次のコマンドを実行して、 <path-to-file>を作成したvector-index.jsonファイルへのパスに置き換えます。

    atlas deployments search indexes create --file <path-to-file>
  1. mongosh を使用して Atlas クラスターに接続します。

    ターミナル ウィンドウでatlas deployments connectを実行し、プロンプトに従って、 mongosh経由で Atlas のローカル配置に接続します。 接続の詳細な手順については、「 Atlas 配置のローカル配置の管理 」を参照してください。

  2. インデックスを作成するコレクションを含むデータベースに切り替えます。

    use sample_mflix
    switched to db sample_mflix
  3. db.collection.createSearchIndex()メソッドを実行します。

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

    このインデックス定義:

  1. MongoDB C ドライバーをインストールします。

    インストール手順の詳細については、 MongoDB C ドライバー のドキュメントを参照してください。

  2. query-quick-startという新しいディレクトリを作成します。

    mkdir query-quick-start
  3. ディレクトリを入力し、 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)
  4. インデックスを定義します。

    vector_index.c というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    vector_index.c
    1#include <bson/bson.h>
    2#include <mongoc/mongoc.h>
    3#include <stdio.h>
    4
    5int 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}

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  5. <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
  6. /buildディレクトリを作成して入力します。

    mkdir build && cd build
  7. プロジェクトを準備します。

    cmake ../
  8. アプリをビルドします。

    cmake --build .
  9. アプリを実行してインデックスを作成します。

    ./atlas-vector-search-quick-start
    1New search index named vector_index is building.
    2Polling to check if the index is ready. This may take up to a minute.
    3vector_index is ready for querying.
  1. MongoDB C++ドライバーをインストールします。

    インストール手順の詳細については、 MongoDB C++ドライバーのドキュメント を参照してください。

  2. query-quick-startという新しいディレクトリを作成します。

    mkdir query-quick-start
  3. ディレクトリを入力し、 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)
  4. インデックスを定義します。

    vector_index.cpp というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    vector_index.cpp
    1#include <bsoncxx/builder/basic/document.hpp>
    2#include <iostream>
    3#include <mongocxx/client.hpp>
    4#include <mongocxx/instance.hpp>
    5#include <mongocxx/search_index_view.hpp>
    6#include <mongocxx/uri.hpp>
    7#include <thread>
    8
    9using bsoncxx::builder::basic::kvp;
    10using bsoncxx::builder::basic::make_array;
    11using bsoncxx::builder::basic::make_document;
    12
    13int 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}

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  5. <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
  6. /buildディレクトリを作成して入力します。

    mkdir build && cd build
  7. プロジェクトを準備します。

    cmake ../
  8. アプリをビルドします。

    cmake --build .
  9. アプリを実行してインデックスを作成します。

    ./query_quick_start
    1New search index named vector_index is building.
    2Polling to check if the index is ready. This may take up to a minute.
    3vector_index is ready for querying.
  1. 次のファイルを作成します: vector-index.json

  2. 次のインデックス定義をコピーして、JSON ファイルに貼り付けます。

    {
    "database": "sample_mflix",
    "collectionName": "embedded_movies",
    "type": "vectorSearch",
    "name": "vector_index",
    "fields": [
    {
    "type": "vector",
    "path": "plot_embedding",
    "numDimensions": 1536,
    "similarity": "dotProduct"
    }
    ]
    }

    このインデックス定義:

  3. ファイルを保存し、ターミナルで次のコマンドを実行して、 <path-to-file>を作成したvector-index.jsonファイルへのパスに置き換えます。

    atlas deployments search indexes create --file <path-to-file>
  1. Go モジュールを初期化します。

    mkdir go-vector-quickstart && cd go-vector-quickstart
    go mod init go-vector-quickstart
  2. Go ドライバーを依存関係としてプロジェクトに追加します。

    go get go.mongodb.org/mongo-driver/mongo

    インストール手順の詳細については、 MongoDB Go ドライバーのドキュメント を参照してください。

  3. インデックスを定義します。

    vector-index.go というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    vector-index.go
    1package main
    2
    3import (
    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
    14func 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}

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  4. <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
  5. 以下のコマンドを実行してインデックスを作成します。

    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.
  1. 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,)'
      }
  2. Java ドライバー JAR ファイルを CLASSPATH に追加します。

    詳しいインストール手順やバージョンの互換性については MongoDB Java Driver のドキュメントを参照ください。

  3. VectorIndex.java というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    VectorIndex.java
    1import com.mongodb.client.ListSearchIndexesIterable;
    2import com.mongodb.client.MongoClient;
    3import com.mongodb.client.MongoClients;
    4import com.mongodb.client.MongoCollection;
    5import com.mongodb.client.MongoCursor;
    6import com.mongodb.client.MongoDatabase;
    7import com.mongodb.client.model.SearchIndexModel;
    8import com.mongodb.client.model.SearchIndexType;
    9import org.bson.Document;
    10import org.bson.conversions.Bson;
    11
    12import java.util.Collections;
    13import java.util.List;
    14
    15public 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}

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  4. <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
  5. 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.
  1. MongoDB Kotlin コルーチン ドライバーをインストールします。

    より詳細なインストール手順とバージョンの互換性については、「MongoDB Kotlin コルーチン ドライバーのドキュメント」を参照してください。

  2. インデックスを定義します。

    VectorIndex.kt というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    VectorIndex.kt
    1import com.mongodb.MongoException
    2import com.mongodb.client.model.SearchIndexModel
    3import com.mongodb.client.model.SearchIndexType
    4import com.mongodb.kotlin.client.coroutine.MongoClient
    5import kotlinx.coroutines.delay
    6import kotlinx.coroutines.flow.toList
    7import org.bson.Document
    8import kotlinx.coroutines.runBlocking
    9
    10fun 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}

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  3. <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
  4. 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.
  1. MongoDB Kotlin Sync ドライバーをインストールします。

    より詳細なインストール手順とバージョンの互換性については、「MongoDB Kotlin Sync ドライバーのドキュメント」を参照してください。

  2. インデックスを定義します。

    VectorIndex.kt というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    VectorIndex.kt
    1import com.mongodb.MongoException
    2import com.mongodb.client.model.SearchIndexModel
    3import com.mongodb.client.model.SearchIndexType
    4import com.mongodb.kotlin.client.MongoClient
    5import org.bson.Document
    6
    7fun 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}

    このインデックス定義:

    このコードには、インデックスが使用可能かどうかを確認するポーリング メカニズムも含まれます。

  3. <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
  4. 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.
  1. MongoDB Node ドライバーを依存関係としてプロジェクトに追加します。

    npm install mongodb

    Tip

    このページの例では、プロジェクトが CommonJS モジュールとしてモジュールを管理することを前提としています。ES モジュールを使用している場合は、代わりにインポート構文を変更する必要があります。

  2. インデックスを定義します。

    vector-index.js というファイルを作成します。以下のコードをコピーして、ファイルに貼り付けます。

    vector-index.js
    1const { MongoClient } = require("mongodb");
    2
    3// connect to your Atlas deployment
    4const uri = "<connectionString>";
    5
    6const client = new MongoClient(uri);
    7
    8async 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}
    53run().catch(console.dir);

    このインデックス定義: