Overview
MongoDB Vector Search 使您能够对存储在MongoDB Atlas中的向量嵌入执行语义搜索。在执行MongoDB Vector Search 查询之前,您必须创建索引,指定要索引的字段以及索引的方式。
要学习;了解有关MongoDB Vector Search 的更多信息,请参阅MongoDB Vector Search 文档中的 MongoDB Vector Search 概述。
样本数据
The examples in this guide use the movies collection in the sample_mflix database from the Atlas sample datasets. To learn how to create a free MongoDB Atlas cluster and load the sample datasets, see the MongoDB Get Started guide.
要从C++应用程序管理sample_mflix集合上的MongoDB Vector Search 索引,请先实例化连接到Atlas 集群的mongocxx::client,然后为 db 和 collection 变量分配以下值:
auto db = client["sample_mflix"]; auto collection = db["movies"];
然后,对 collection 变量调用 search_indexes() 方法,在集合上实例化 mongocxx::search_index_view:
auto siv = collection.search_indexes();
mongocxx::search_index_view 类包含以下允许您与MongoDB Vector Search 索引进行交互的成员函数:
create_one():使用指定配置创建MongoDB Vector Search索引list():返回一个mongocxx::cursor对象,该对象指向集合上的MongoDB Vector Search 和 Search 索引列表update_one():更新指定MongoDB Vector Search索引的定义drop_one():从集合中删除指定索引
以下部分提供的代码示例演示了如何使用每种MongoDB Vector Search索引管理方法。
注意
MongoDB Vector Search 索引管理是异步的
MongoDB C++驱动程序异步管理MongoDB Vector Search 索引。以下部分中描述的库方法会立即返回服务器响应,但对MongoDB Vector Search 索引的更改会在背景进行,可能要稍后一段时间才能完成。
创建MongoDB Vector Search 索引
要在集合上创建单个MongoDB Vector Search索引,请对 mongocxx::search_index_view对象调用 create_one() 方法,并传入指定要创建索引的mongocxx::search_index_model对象。
mongocxx::search_index_model 构造函数需要以下参数:
name:指定索引索引的字符串definition:指定如何配置索引中字段的文档
提示
以下示例展示了如何创建单个MongoDB Vector Search索引:
// Define the index model with an index name and a definition document auto model = mongocxx::search_index_model( "<vectorSearchIndexName>", make_document( kvp("fields", make_array(make_document( kvp("type", "vector"), kvp("path", "<fieldName>"), kvp("numDimensions", 2048), kvp("similarity", "dotProduct"), kvp("quantization", "scalar")))))); model.type("vectorSearch"); // Creates the vector search index auto result = siv.create_one(model); std::cout << "New vector search index name: " << result << std::endl;
New vector search index name: vector_search
向量搜索索引的定义如下:
type:索引的类型为vectorSearch。path:索引位于plot_embedding_voyage_3_large字段上。numDimensions:向量嵌入的维数为2048。similarity:索引使用dotProduct相似度来衡量相似度。quantization:索引使用scalar量化。
列出MongoDB Vector Search 索引
要列出集合上的所有搜索索引,请对 mongocxx::search_index_view对象调用 list() 方法。此方法返回一个 mongocxx::cursor对象,您可以使用该对象迭代集合的MongoDB Vector Search 和MongoDB Search 索引。
以下示例打印指定集合上的可用搜索索引列表:
auto cursor = siv.list(); for (auto const& doc : siv.list()) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "id" : ..., "name" : "vector_index", "type" : "vectorSearch", ..., "latestDefinition" : { "fields" : [ { "type" : "vector", "path" : "plot_embedding_voyage_3_large", "numDimensions" : 2048, ...}
或者,您可以通过将索引名称传递到 list() 方法来列出单个MongoDB Vector Search索引。这将返回一个 mongocxx::cursor对象,该对象指向仅包含指定索引的结果设立。
以下示例使用 list() 方法返回名称为 vector_index 的索引:
for (auto const& doc : siv.list("vector_index")) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "id" : ..., "name" : "vector_index", "type" : "vectorSearch", ..., "latestDefinition" : { "fields" : [ { "type" : "vector", "path" : "plot_embedding_voyage_3_large", "numDimensions" : 2048, ...}
更新MongoDB Vector Search 索引
要更新MongoDB Vector Search索引,请对 mongocxx::search_index_view对象调用 update_one() 方法,并传入要更新的索引名称以及要更新到的索引的定义。
以下示例展示了如何更新一个创建MongoDB Vector Search 索引示例中的现有MongoDB Vector Search索引,以使用 euclidean而不是dotProduct 相似度以及binary 而不是scalar 量化:
auto definition = make_document( kvp("fields", make_array(make_document( kvp("type", "vector"), kvp("path", "plot_embedding_voyage_3_large"), kvp("numDimensions", 2048), kvp("similarity", "euclidean"), kvp("quantization", "binary"))))); siv.update_one("vector_index", definition.view());
删除MongoDB Vector Search 索引
要从集合中删除MongoDB Vector Search索引,请对 mongocxx::search_index_view对象调用 drop_one() 方法并传入要删除的索引的名称。
以下示例展示如何删除名为 vector_index 的MongoDB Vector Search索引:
siv.drop_one("vector_index");
更多信息
有关演示如何在C++驾驶员中管理索引的示例应用程序,请参阅 索引指南。
有关如何使用MongoDB Vector Search功能和定义MongoDB Vector Search 索引的更详细指南,请参阅以下MongoDB Vector Search 文档页面:
API 文档
要学习;了解有关本指南中讨论的方法的更多信息,请参阅以下API文档: