diff --git a/source/fundamentals/indexes.txt b/source/fundamentals/indexes.txt index 50f8428a..37b8c076 100644 --- a/source/fundamentals/indexes.txt +++ b/source/fundamentals/indexes.txt @@ -243,6 +243,100 @@ field in the ``sample_mflix.movies`` collection: Name of Index Created: cast_-1 +.. _golang-atlas-search-indexes: + +Atlas Search and Atlas Vector Search Indexes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can programmatically manage your Atlas Search and Atlas Vector +Search indexes by using the {+driver-short+}. + +The Atlas Search feature enables you to perform full-text searches on +collections hosted on MongoDB Atlas. To learn more about Atlas +Search, see the :atlas:`Atlas Search +` documentation. + +Atlas Vector Search enables you to perform semantic searches on vector +embeddings stored in Atlas. To learn more about Atlas +Vector Search, see the :atlas:`Atlas Vector Search +` documentation. + +.. Add when Go AVS guide is ready: +.. To learn more about Atlas Vector Search, see the :ref:`golang-atlas-vector-search` guide. + +The following sections contain code examples that demonstrate how to manage Atlas +Search and Atlas Vector Search indexes. + +Create a Search Index +````````````````````` + +You can create an Atlas Search or an Atlas Vector Search index by providing +an index definition to the ``SearchIndexView.CreateOne()`` method. + +The following example creates an Atlas Search index on the ``plot`` field of the +``sample_mflix.movies`` collection: + +.. literalinclude:: /includes/fundamentals/code-snippets/indexes/atlasVectorSearch.go + :language: go + :start-after: start-create-atlas-search + :end-before: end-create-atlas-search + :dedent: + +The following example creates an Atlas Vector Search index on the ``plot_embedding`` +field in the ``sample_mflix.embedded_movies`` collection: + +.. literalinclude:: /includes/fundamentals/code-snippets/indexes/atlasVectorSearch.go + :language: go + :start-after: start-create-vector-search + :end-before: end-create-vector-search + :dedent: + +List a Search Index +``````````````````` + +You can use the ``SearchIndexView.List()`` method to list an Atlas Search or Atlas +Vector Search index by specifying the name of the index. + +The following example lists the details of the specified Atlas Search or Atlas +Vector Search index: + +.. literalinclude:: /includes/fundamentals/code-snippets/indexes/atlasVectorSearch.go + :language: go + :start-after: start-list-index + :end-before: end-list-index + :dedent: + +Update a Search Index +````````````````````` + +You can use the ``SearchIndexView.UpdateOne()`` method to update an Atlas Search +or Atlas Vector Search index by specifying the name of the index and the new +index definition. + +The following example updates an Atlas Vector Search index by providing the name +of the index and a new index definition: + +.. literalinclude:: /includes/fundamentals/code-snippets/indexes/atlasVectorSearch.go + :language: go + :start-after: start-update-index + :end-before: end-update-index + :dedent: + +Delete a Search Index +````````````````````` + +You can use the ``SearchIndexView.DropOne()`` method to delete an Atlas Search or +Atlas Vector Search index by specifying the name of the index. + +The following example deletes an Atlas Search or Atlas Vector Search +index with the specified name: + +.. literalinclude:: /includes/fundamentals/code-snippets/indexes/atlasVectorSearch.go + :language: go + :start-after: start-delete-index + :end-before: end-delete-index + :dedent: + .. _golang-clustered-indexes: Clustered Indexes @@ -483,14 +577,16 @@ guides: API Documentation ~~~~~~~~~~~~~~~~~ -To learn more about any of the methods discussed in this -guide, see the following API Documentation: +To learn more about the methods discussed in this +guide and related ones, see the following API Documentation: - `IndexModel <{+api+}/mongo#IndexModel>`__ -- `CreateOne() <{+api+}/mongo#IndexView.CreateOne>`__ - `IndexOptions <{+api+}/mongo/options#IndexOptions>`__ - `SetDefaultLanguage() <{+api+}/mongo/options#IndexOptionsBuilder.SetDefaultLanguage>`__ +- `CreateOne() <{+api+}/mongo#IndexView.CreateOne>`__ - `DropOne() <{+api+}/mongo#IndexView.DropOne>`__ - `CreateCollection() <{+api+}/mongo#Database.CreateCollection>`__ - `CreateCollectionOptions <{+api+}/mongo/options#CreateCollectionOptions>`__ +- `SearchIndexes <{+api+}/mongo#Collection.SearchIndexes>`__ +- `SearchIndexView <{+api+}/mongo#SearchIndexView>`__ diff --git a/source/includes/fundamentals/code-snippets/indexes/atlasVectorSearch.go b/source/includes/fundamentals/code-snippets/indexes/atlasVectorSearch.go new file mode 100644 index 00000000..0d81b17b --- /dev/null +++ b/source/includes/fundamentals/code-snippets/indexes/atlasVectorSearch.go @@ -0,0 +1,167 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "os" + + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" +) + +func main() { + ctx := context.Background() + + // Retrieves your Atlas connection string + uri := os.Getenv("MONGODB_ATLAS_URI") + if uri == "" { + log.Fatal("MONGODB_ATLAS_URI environment variable is not set") + } + + // Connect to your Atlas cluster + clientOptions := options.Client().ApplyURI(uri) + client, err := mongo.Connect(ctx, clientOptions) + if err != nil { + log.Fatalf("Failed to connect to the server: %v", err) + } + defer func() { + if err := client.Disconnect(ctx); err != nil { + log.Fatalf("Failed to disconnect: %v", err) + } + }() + + // Set the namespace + coll := client.Database("sample_mflix").Collection("embedded_movies") + + // start-create-vector-search + // Defines the structs used for the index definition + type vectorDefinitionField struct { + Type string `bson:"type"` + Path string `bson:"path"` + NumDimensions int `bson:"numDimensions"` + Similarity string `bson:"similarity"` + Quantization string `bson:"quantization"` + } + + type vectorDefinition struct { + Fields []vectorDefinitionField `bson:"fields"` + } + + // Sets the index name and type to "vectorSearch" + const indexName = "vector_search_index" + opts := options.SearchIndexes().SetName(indexName).SetType("vectorSearch") + + // Defines the index definition + vectorSearchIndexModel := mongo.SearchIndexModel{ + Definition: vectorDefinition{ + Fields: []vectorDefinitionField{{ + Type: "vector", + Path: "plot_embedding", + NumDimensions: 1536, + Similarity: "dotProduct", + Quantization: "scalar"}}, + }, + Options: opts, + } + + // Creates the index + searchIndexName, err := coll.SearchIndexes().CreateOne(ctx, vectorSearchIndexModel) + if err != nil { + log.Fatalf("Failed to create the Atlas Vector Search index: %v", err) + } + // end-create-vector-search + + // Creates an Atlas Search index + // start-create-atlas-search + // Sets the index name and type to "search" + const indexName = "search_index" + opts := options.SearchIndexes().SetName(indexName).SetType("search") + + // Defines the index definition + searchIndexModel := mongo.SearchIndexModel{ + Definition: bson.D{ + {Key: "mappings", Value: bson.D{ + {Key: "dynamic", Value: false}, + {Key: "fields", Value: bson.D{ + {Key: "plot", Value: bson.D{ + {Key: "type", Value: "string"}, + }}, + }}, + }}, + }, + Options: opts, + } + + // Creates the index + searchIndexName, err := coll.SearchIndexes().CreateOne(ctx, searchIndexModel) + if err != nil { + log.Fatalf("Failed to create the Atlas Search index: %v", err) + } + // end-create-atlas-search + + // start-list-index + // Specifies the index to retrieve + const indexName = "myIndex" + opts := options.SearchIndexes().SetName(indexName) + + // Retrieves the details of the specified index + cursor, err := coll.SearchIndexes().List(ctx, opts) + + // Prints the index details to the console as JSON + var results []bson.D + if err := cursor.All(ctx, &results); err != nil { + log.Fatalf("Failed to unmarshal results to bson: %v", err) + } + res, err := json.Marshal(results) + if err != nil { + log.Fatalf("Failed to marshal results to json: %v", err) + } + fmt.Println(res) + // end-list-index + + // start-update-index + // Specifies the index name and the new index definition + const indexName = "vector_search_index" + + type vectorDefinitionField struct { + Type string `bson:"type"` + Path string `bson:"path"` + NumDimensions int `bson:"numDimensions"` + Similarity string `bson:"similarity"` + } + + type vectorDefinition struct { + Fields []vectorDefinitionField `bson:"fields"` + } + + definition := vectorDefinition{ + Fields: []vectorDefinitionField{ + { + Type: "vector", + Path: "plot_embedding", + NumDimensions: 1536, + Similarity: "cosine", + Quantization: "scalar", + }, + }, + } + + // Updates the specified index + err := coll.SearchIndexes().UpdateOne(ctx, indexName, definition) + if err != nil { + log.Fatalf("Failed to update the index: %v", err) + } + // end-update-index + + // start-delete-index + // Deletes the specified index + err := coll.SearchIndexes().DropOne(ctx, "myIndex") + if err != nil { + log.Fatalf("Failed to delete the index: %v", err) + } + // end-delete-index + +}