Docs Menu
Docs Home
/
MongoDB Atlas
/

Atlas Vector Search Quick Start

On this page

  • Objectives
  • Create a Vector Search Index
  • Run a Vector Search Query
  • Learning Summary
  • Next Steps

This quick start describes how to load sample documents that contain vector embeddings into an Atlas cluster or local Atlas deployment, create an Atlas Vector Search index on those embeddings, and then perform semantic search to return documents that are similar to your query.

Time required: 15 minutes

In this quick start, you will do the following steps:

  1. Create an index definition for the sample_mflix.embedded_movies collection that indexes the plot_embedding field as the vector type. The plot_embedding field contains embeddings created using OpenAI's text-embedding-ada-002 embedding model. The index definition specifies 1536 vector dimensions and measures similarity using dotProduct.

  2. Run an Atlas Vector Search query that searches the sample sample_mflix.embedded_movies collection. The query uses the $vectorSearch stage to search the plot_embedding field, which contains embeddings created using OpenAI's text-embedding-ada-002 embedding model. The query searches the plot_embedding field using vector embeddings for the string time travel. It considers up to 150 nearest neighbors, and returns 10 documents in the results.

To learn more, see Learning Summary.


➤ To set the client you use to run the examples on this page, use the Select your language drop-down menu in the right navigation pane.


In this section, you create an Atlas Vector Search index on sample data that you load into an Atlas cluster or a deployment hosted on your local computer:

1
  1. Create a free Atlas account or sign in to an existing account.

  2. If you don't yet have an Atlas cluster, create a free M0 cluster. To learn more about creating an Atlas cluster, see Create a Cluster.

    Note

    If you are working with an existing cluster, you must have Project Data Access Admin or higher access to your Atlas project.

    If you create a new cluster, you have the necessary permissions by default.

    You can create only one M0 Free cluster per project.

  3. In the left sidebar, click Atlas Search. Choose your cluster from the Select data source menu and click Go to Atlas Search.

  4. If you haven't yet loaded the sample dataset onto your cluster, click Load a Sample Dataset. In the Load Sample Dataset dialog box, click Load Sample Dataset to confirm.

    If you already loaded the sample dataset, check that the sample_mflix database contains the embedded_movies collection. If it doesn't, drop the sample databases and reload the sample dataset.

    Loading the sample dataset can take several minutes to complete.

2

Note

You can use the mongosh command or driver helper methods to create Atlas Search indexes on all Atlas cluster tiers. For a list of supported driver versions, see Supported Clients.

  1. When the sample data finishes loading, click Create Search Index.

  2. Under the Atlas Vector Search section, select the JSON Editor and click Next.

  3. In the Database and Collection section, expand the sample_mflix database and select the embedded_movies collection.

    Each document in this collection contains information about a movie, including a summary of the movie's plot as a string, which has also been converted to and stored as a vector embedding in the document's plot_embedding field.

  4. In the Index Name field, specify vector_index.

  5. Copy and paste the following vector search index definition into the JSON Editor.

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

    This index definition:

  6. Click Next.

  7. Click Create Search Index.

    The index should take about one minute to build. When your vector index is finished building, the Status column reads Active.

  1. Connect to the Atlas cluster using mongosh.

    Open mongosh in a terminal window and connect to your Atlas cluster. For detailed instructions on connecting, see Connect via mongosh.

  2. Switch to the database that contains the collection for which you want to create the index.

    Example

    use sample_mflix
    switched to db sample_mflix
  3. Run the db.collection.createSearchIndex() method.

    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": "euclidean"
    11 }
    12 ]
    13 }
    14);

    This index definition:

  1. Install the MongoDB C Driver.

    For detailed installation instructions, refer to the MongoDB C Driver documentation.

  2. Create a new directory called query-quick-start.

    mkdir query-quick-start
  3. Enter the directory, and create a CMakeLists.txt file.

    cd query-quick-start
    touch CMakeLists.txt

    Copy and paste the following lines into the CMakeLists.txt file:

    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. Define the index.

    Create a file named vector_index.c. Copy and paste the following code into the file.

    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  5. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  6. Create and enter the /build directory:

    mkdir build && cd build
  7. Prepare the project.

    cmake ../
  8. Build the app.

    cmake --build .
  9. Execute the app to create the index.

    ./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. Install the MongoDB C++ Driver.

    For detailed installation instructions, refer to the MongoDB C++ Driver documentation.

  2. Create a new directory called query-quick-start.

    mkdir query-quick-start
  3. Enter the directory, and create a CMakeLists.txt file.

    cd query-quick-start
    touch CMakeLists.txt

    Copy and paste the following lines into the CMakeLists.txt file:

    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. Define the index.

    Create a file named vector_index.cpp. Copy and paste the following code into the file.

    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  5. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  6. Create and enter the /build directory:

    mkdir build && cd build
  7. Prepare the project.

    cmake ../
  8. Build the app.

    cmake --build .
  9. Execute the app to create the index.

    ./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. When the sample data finishes loading, click Create Search Index.

  2. Under the Atlas Vector Search section, select the JSON Editor and click Next.

  3. In the Database and Collection section, expand the sample_mflix database and select the embedded_movies collection.

    Each document in this collection contains information about a movie, including a summary of the movie's plot as a string, which has also been converted to and stored as a vector embedding in the document's plot_embedding field.

  4. In the Index Name field, specify vector_index.

  5. Copy and paste the following vector search index definition into the JSON Editor.

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

    This index definition:

  6. Click Next.

  7. Click Create Search Index.

    The index should take about one minute to build. When your vector index is finished building, the Status column reads Active.

  1. Initialize your Go module:

    mkdir go-vector-quickstart && cd go-vector-quickstart
    go mod init go-vector-quickstart
  2. Add the Go Driver as a dependency in your project:

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

    For more detailed installation instructions, see the MongoDB Go Driver documentation.

  3. Define the index.

    Create a file named vector-index.go. Copy and paste the following code into the file.

    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: "euclidean"}},
    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  4. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  5. Run the following command to create the index.

    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. Add the Java driver version 5.2 or higher as a dependency in your project:

    • If you are using Maven, add the following dependency to your pom.xml dependencies list:

      <dependency>
      <groupId>org.mongodb</groupId>
      <artifactId>mongodb-driver-sync</artifactId>
      <version>[5.2.0,)</version>
      </dependency>
    • If you are using Gradle, add the following dependency to your build.gradle dependencies list:

      dependencies {
      implementation 'org.mongodb:mongodb-driver-sync:[5.2.0,)'
      }
  2. Add the Java driver JAR files to your CLASSPATH.

    For more detailed installation instructions and version compatibility, see the MongoDB Java Driver documentation.

  3. Create a file named VectorIndex.java. Copy and paste the following code into the file.

    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", "euclidean")));
    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  4. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  5. Run the file in your IDE, or execute a command from the command line to run the code.

    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. Install the MongoDB Kotlin Coroutine Driver.

    For more detailed installation instructions and version compatibility, see the MongoDB Kotlin Coroutine Driver documentation.

  2. Define the index.

    Create a file named VectorIndex.kt. Copy and paste the following code into the file.

    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  3. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  4. Run the VectorIndex.kt file in your IDE. The output should resemble the following:

    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. Install the MongoDB Kotlin Sync Driver.

    For more detailed installation instructions and version compatibility, see the MongoDB Kotlin Sync Driver documentation.

  2. Define the index.

    Create a file named VectorIndex.kt. Copy and paste the following code into the file.

    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  3. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  4. Run the VectorIndex.kt file in your IDE. The output should resemble the following:

    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. Add the MongoDB Node Driver as a dependency in your project:

    npm install mongodb

    Tip

    The examples on this page assume your project manages modules as CommonJS modules. If you're using ES modules, instead, you must modify the import syntax.

  2. Define the index.

    Create a file named vector-index.js. Copy and paste the following code into the file.

    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": "euclidean"
    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);

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  3. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  4. Run the following command to create the index.

    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. Install the MongoDB PHP Driver.

    For detailed installation instructions, see the MongoDB PHP Library documentation.

  2. Define the index.

    Create a file named vector-index.php. Copy and paste the following code into the file.

    vector-index.php
    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  3. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  4. Run the following command to create the index.

    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. Add the PyMongo Driver as a dependency in your project:

    pip install pymongo

    For more detailed installation instructions, see the MongoDB Python Driver documentation.

  2. Define the index.

    Create a file named vector-index.py. Copy and paste the following code into the file.

    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": "euclidean"
    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()

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  3. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  4. Run the following command to create the index.

    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. When the sample data finishes loading, click Create Search Index.

  2. Under the Atlas Vector Search section, select the JSON Editor and click Next.

  3. In the Database and Collection section, expand the sample_mflix database and select the embedded_movies collection.

    Each document in this collection contains information about a movie, including a summary of the movie's plot as a string, which has also been converted to and stored as a vector embedding in the document's plot_embedding field.

  4. In the Index Name field, specify vector_index.

  5. Copy and paste the following vector search index definition into the JSON Editor.

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

    This index definition:

  6. Click Next.

  7. Click Create Search Index.

    The index should take about one minute to build. When your vector index is finished building, the Status column reads Active.

  1. Install the Rust driver for MongoDB.

    For more detailed installation instructions, see the MongoDB Rust Driver documentation.

  2. Define the index.

    In the /src directory of your project, create a file named vector_index.rs. Copy and paste the following code into the file.

    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  3. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  4. Call the function from your main.rs.

    mod vector_index;
    fn main() {
    vector_index::vector_index();
    }
  5. Run the file in your IDE, or execute a command from the command line to run the code.

    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. Install the MongoDB Scala Driver.

    For installation instructions based on your environment and the version of Scala you are using, refer to the MongoDB Scala Driver documentation.

  2. Create a new Scala project with the tools you normally use. For this quick start, we create a project named quick-start, by using sbt.

    sbt new scala/hello-world.g8

    When prompted, name the application quick-start.

  3. Navigate to your quick-start project and create a file named VectorIndex.scala. Copy and paste the following code into the file.

    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  4. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  5. Create a class instance and call the function in your project's Main.scala file.

    object Main extends App {
    private val indexInstance = new VectorIndex
    indexInstance.createIndex()
    }
  6. Run the file in your IDE, or execute a command from the command line to run the code.

    There are many tools and environments in which Scala runs. In this example, we run the new Scala project by starting the sbt server with the sbt command, then typing ~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

For detailed instructions, see Prerequisites.

  1. Install the Atlas CLI.

    If you use Homebrew, you can run the following command in your terminal:

    brew install mongodb-atlas-cli

    For installation instructions on other operating systems, see Install the Atlas CLI

  2. Install Docker.

    Docker requires a network connection for pulling and caching MongoDB images.

2
  1. If you don't have an existing Atlas account, run atlas setup in your terminal or create a new account.

  2. Run atlas deployments setup and follow the prompts to create a local deployment. When prompted to connect to the deployment, select skip.

    For detailed instructions, see Create a Local Atlas Deployment.

3
  1. Run the following command in your terminal to download the sample data:

    curl https://atlas-education.s3.amazonaws.com/sampledata.archive -o sampledata.archive
  2. Run the following command to load the data into your deployment, replacing <port-number> with the port where you're hosting the deployment:

    mongorestore --archive=sampledata.archive --port=<port-number>
4
  1. Create a file named vector-index.json

  2. Copy and paste the following index definition into the JSON file.

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

    This index definition:

  3. Save the file, and then run the following command in your terminal, replacing <path-to-file> with the path to the vector-index.json file that you created.

    atlas deployments search indexes create --file <path-to-file>
  1. Connect to the Atlas cluster using mongosh.

    In a terminal window, run atlas deployments connect and follow the prompts to connect to your local Atlas deployment via mongosh. For detailed instructions on connecting, see Manage a Local Atlas Deployment.

  2. Switch to the database that contains the collection for which you want to create the index.

    Example

    use sample_mflix
    switched to db sample_mflix
  3. Run the db.collection.createSearchIndex() method.

    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": "euclidean"
    11 }
    12 ]
    13 }
    14);

    This index definition:

  1. Install the MongoDB C Driver.

    For detailed installation instructions, refer to the MongoDB C Driver documentation.

  2. Create a new directory called query-quick-start.

    mkdir query-quick-start
  3. Enter the directory, and create a CMakeLists.txt file.

    cd query-quick-start
    touch CMakeLists.txt

    Copy and paste the following lines into the CMakeLists.txt file:

    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. Define the index.

    Create a file named vector_index.c. Copy and paste the following code into the file.

    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  5. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  6. Create and enter the /build directory:

    mkdir build && cd build
  7. Prepare the project.

    cmake ../
  8. Build the app.

    cmake --build .
  9. Execute the app to create the index.

    ./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. Install the MongoDB C++ Driver.

    For detailed installation instructions, refer to the MongoDB C++ Driver documentation.

  2. Create a new directory called query-quick-start.

    mkdir query-quick-start
  3. Enter the directory, and create a CMakeLists.txt file.

    cd query-quick-start
    touch CMakeLists.txt

    Copy and paste the following lines into the CMakeLists.txt file:

    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. Define the index.

    Create a file named vector_index.cpp. Copy and paste the following code into the file.

    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  5. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  6. Create and enter the /build directory:

    mkdir build && cd build
  7. Prepare the project.

    cmake ../
  8. Build the app.

    cmake --build .
  9. Execute the app to create the index.

    ./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 a file named vector-index.json

  2. Copy and paste the following index definition into the JSON file.

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

    This index definition:

  3. Save the file, and then run the following command in your terminal, replacing <path-to-file> with the path to the vector-index.json file that you created.

    atlas deployments search indexes create --file <path-to-file>
  1. Initialize your Go module:

    mkdir go-vector-quickstart && cd go-vector-quickstart
    go mod init go-vector-quickstart
  2. Add the Go Driver as a dependency in your project:

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

    For more detailed installation instructions, see the MongoDB Go Driver documentation.

  3. Define the index.

    Create a file named vector-index.go. Copy and paste the following code into the file.

    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: "euclidean"}},
    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  4. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  5. Run the following command to create the index.

    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. Add the Java driver version 5.2 or higher as a dependency in your project:

    • If you are using Maven, add the following dependency to your pom.xml dependencies list:

      <dependency>
      <groupId>org.mongodb</groupId>
      <artifactId>mongodb-driver-sync</artifactId>
      <version>[5.2.0,)</version>
      </dependency>
    • If you are using Gradle, add the following dependency to your build.gradle dependencies list:

      dependencies {
      implementation 'org.mongodb:mongodb-driver-sync:[5.2.0,)'
      }
  2. Add the Java driver JAR files to your CLASSPATH.

    For more detailed installation instructions and version compatibility, see the MongoDB Java Driver documentation.

  3. Create a file named VectorIndex.java. Copy and paste the following code into the file.

    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", "euclidean")));
    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  4. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  5. Run the file in your IDE, or execute a command from the command line to run the code.

    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. Install the MongoDB Kotlin Coroutine Driver.

    For more detailed installation instructions and version compatibility, see the MongoDB Kotlin Coroutine Driver documentation.

  2. Define the index.

    Create a file named VectorIndex.kt. Copy and paste the following code into the file.

    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  3. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  4. Run the VectorIndex.kt file in your IDE. The output should resemble the following:

    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. Install the MongoDB Kotlin Sync Driver.

    For more detailed installation instructions and version compatibility, see the MongoDB Kotlin Sync Driver documentation.

  2. Define the index.

    Create a file named VectorIndex.kt. Copy and paste the following code into the file.

    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  3. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  4. Run the VectorIndex.kt file in your IDE. The output should resemble the following:

    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. Add the MongoDB Node Driver as a dependency in your project:

    npm install mongodb

    Tip

    The examples on this page assume your project manages modules as CommonJS modules. If you're using ES modules, instead, you must modify the import syntax.

  2. Define the index.

    Create a file named vector-index.js. Copy and paste the following code into the file.

    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": "euclidean"
    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);

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  3. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  4. Run the following command to create the index.

    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. Install the MongoDB PHP Driver.

    For detailed installation instructions, see the MongoDB PHP Library documentation.

  2. Define the index.

    Create a file named vector-index.php. Copy and paste the following code into the file.

    vector-index.php
    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}

    This index definition:

    This code also includes a polling mechanism to check if the index is ready to use.

  3. Specify the <connection-string>.

    Replace <connection-string> with the connection string for your Atlas cluster or local deployment, and then save the file.

    Your connection string should use the following format:

    mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

    Note

    Ensure that your connection string includes your database user's credentials. To learn more about finding your connection string, see Connect via Drivers.

    Your connection string should use the following format:

    mongodb://localhost:<port-number>/?directConnection=true
  4. Run the following command to create the index.

    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. Add the PyMongo Driver as a dependency in your project:

    pip install pymongo

    For more detailed installation instructions, see the MongoDB Python Driver documentation.

  2. Define the index.

    Create a file named vector-index.py. Copy and paste the following code into the file.

    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": "euclidean"
    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()

    This index definition: