Atlas Search 索引
在此页面上
Overview
MongoDB Atlas Search 功能使您能够对 Atlas 上托管的集合执行全文搜索。在执行 Atlas Search 查询之前,您必须创建索引,指定要为哪些字段编制索引以及如何为它们编制索引。
要学习;了解有关Atlas Search的更多信息,请参阅Atlas Search文档中的 Atlas Search概述。
样本数据
本指南中的示例使用Atlas示例数据集的sample_mflix
数据库中的 movies
集合。 要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅Atlas入门指南。
要从C++应用程序管理sample_mflix
集合上的Atlas 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
类包含以下成员函数,可与Atlas Search索引进行交互:
create_one() :使用指定配置创建Atlas Search索引
create_many() :使用指定配置创建多个Atlas Search索引
list() :返回一个
mongocxx::cursor
实例,该实例指向集合上的Atlas Search索引列表update_one() :更新指定Atlas Search索引的定义
drop_one() :从集合中删除指定索引
注意
Atlas Search索引管理是异步的
MongoDB C++驱动程序以异步方式管理Atlas Search索引。以下部分中描述的库方法会立即返回服务器响应,但对Atlas Search索引的更改会在背景进行,可能要稍后一段时间才能完成。
以下各节将提供代码示例,演示如何使用每种 Atlas Search 索引管理方法。
创建 Atlas Search 索引
要在集合上创建单个Atlas Search索引,请在 mongocxx::search_index_view
实例上调用 create_one()
方法,并传入指定要创建索引的 mongoxcc::search_index_model
实例。
mongocxx::search_index_model
构造函数需要以下参数:
name
:指定索引名称的字符串definition
:包含mappings
字段的文档,指定如何配置索引中的字段
以下部分介绍如何创建使用静态或动态映射的单个Atlas Search索引。
使用静态映射创建Atlas Search索引
在Atlas Search索引中使用静态映射来指定要索引的字段,并为各个字段配置索引选项。
要创建使用静态映射的单个Atlas Search索引,请先创建一个包含 mappings
字段的 definition
文档。在 mappings
字段,指定包含以下字段和值的文档:
dynamic
:设置为false
。fields
:指定要索引的字段名称及其索引配置的文档。要学习;了解有关mappings.fields
选项的更多信息,请参阅Atlas Search文档中的静态映射示例。
然后,将 name
字符串和 definition
文档传递给 mongocxx::search_index_model
构造函数以实例化 mongocxx::search_index_model
。将此 mongocxx::search_index_model
实例传递给 create_one()
方法,以将指定的Atlas Search索引添加到您的集合中。
以下示例展示了如何创建使用静态映射的单个Atlas Search索引:
// Create an index model with your index name and definition containing the fields you want to index auto name = "myStaticIndex"; auto fields = make_document(kvp("title", make_document(kvp("type", "string"), kvp("analyzer","lucene.standard"))), kvp("year", make_document(kvp("type","number")))); auto definition = make_document(kvp("mappings", make_document(kvp("dynamic", false), kvp("fields", fields)))); auto model = mongocxx::search_index_model(name, definition.view()); // Create the search index auto result = siv.create_one(model); std::cout << "New index name: " << result << std::endl;
New index name: myStaticIndex
重要
您无法对字段名称开头包含美元 ($
) 符号的字段创建索引。
使用动态映射创建Atlas Search索引
在Atlas Search索引中使用动态映射,自动为所有受支持类型的字段创建索引。有关支持的BSON数据类型的列表,请参阅Atlas Search文档中的数据类型部分。
要创建使用动态映射的单个Atlas Search索引,请先创建一个包含 mappings
字段的 definition
文档。在 mappings
字段,指定包含 dynamic
字段的文档,并将其值设立为 true
。然后,将 name
字符串和 definition
文档传递给 mongocxx::search_index_model
构造函数以实例化 mongocxx::search_index_model
。将此 mongocxx::search_index_model
实例传递给 create_one()
方法,以将指定的Atlas Search索引添加到集合中。
以下示例展示了如何创建使用动态映射的单个Atlas Search索引:
// Create an index model with your index name and definition auto name = "myDynamicIndex"; auto definition = make_document(kvp("mappings", make_document(kvp("dynamic", true)))); auto model = mongocxx::search_index_model(name, definition.view()); // Create the search index auto result = siv.create_one(model); std::cout << "New index name: " << result << std::endl;
New index name: myDynamicIndex
创建多个Atlas Search索引
要创建多个Atlas Search索引,请对 mongocxx::search_index_view
实例调用 create_many()
方法,并传入指定要创建的Atlas Search索引的 mongocxx::search_index_model
实例向量。
以下示例展示了如何创建多个Atlas Search索引:
// Create a vector to store Search index models std::vector<mongocxx::search_index_model> models; // Add an index model with dynamic mappings to the input vector auto name_1 = "myDynamicIndex"; auto definition_1 = make_document(kvp("mappings", make_document(kvp("dynamic", true)))); auto model_1 = mongocxx::search_index_model(name_1, definition_1.view()); models.push_back(model_1); // Add an index model with static mappings to the input vector auto name_2 = "myStaticIndex"; auto fields = make_document(kvp("title", make_document(kvp("type", "string"), kvp("analyzer","lucene.standard"))), kvp("year", make_document(kvp("type","number")))); auto definition_2 = make_document(kvp("mappings", make_document(kvp("dynamic", false), kvp("fields", fields)))); auto model_2 = mongocxx::search_index_model(name_2, definition_2.view()); models.push_back(model_2); // Create the search indexes auto result = siv.create_many(models); // Print the search index names std::cout << "New index names:" << std::endl; for (const std::string& name : result) { std::cout << name << std::endl; }
New index names: myDynamicIndex myStaticIndex
列出Atlas Search索引
要列出集合上的Atlas Search索引,请在 mongocxx::search_index_view
实例上调用 list()
方法。此方法返回一个 mongocxx::cursor
实例,您可以使用该实例迭代集合的Atlas Search索引。
以下示例通过迭代指向创建多个Atlas Search索引中索引的 实例来打印Atlas Search索引列表:cursor::iterator
auto cursor = siv.list(); for (mongocxx::cursor::iterator it = cursor.begin(); it != cursor.end(); ++it) { std::cout << bsoncxx::to_json(*it) << std::endl; }
{ "id" : ..., "name" : "myDynamicIndex", "type" : "search", ..., "latestDefinition" : { "mappings" : { "dynamic" : true } }, ...} { "id" : ..., "name" : "myStaticIndex", "type" : "search", ..., "latestDefinition" : { "mappings" : { "dynamic" : false, "fields" : { "title" : { "type" : "string", "analyzer" : "lucene.standard" }, "year" : { "type" : "number" } } } }, ...}
或者,您可以通过将索引名称传递到 list()
方法来列出特定的Atlas Search索引。这将返回一个 mongocxx::cursor
实例,该实例指向仅包含指定索引的结果设立。
以下示例使用 list()
方法打印名称为 myDynamicIndex
的索引:
auto cursor = siv.list("myDynamicIndex"); for (mongocxx::cursor::iterator it = cursor.begin(); it != cursor.end(); ++it) { std::cout << bsoncxx::to_json(*it) << std::endl; }
{ "id" : ..., "name" : "myDynamicIndex", "type" : "search", ..., "latestDefinition" : { "mappings" : { "dynamic" : true } }, ...}
更新 Atlas Search 索引
要更新Atlas Search索引,请在 mongocxx::search_index_view
实例上调用 update_one()
方法,并传入要更新的索引名称以及要更新到的索引的定义。
以下示例展示了如何更新使用静态映射创建搜索索引中的Atlas Search索引,以在 title
字段上使用简单的分析器:
auto update_fields = make_document(kvp("title", make_document(kvp("type", "string"), kvp("analyzer","lucene.simple"))), kvp("year", make_document(kvp("type","number")))); auto update_definition = make_document(kvp("mappings", make_document(kvp("dynamic", false), kvp("fields", update_fields)))); siv.update_one("myStaticIndex", update_definition.view());
删除Atlas Search索引
要从集合删除Atlas Search索引,请在 mongocxx::search_index_view
实例上调用 drop_one()
方法并传入要删除的索引的名称。
以下示例展示如何删除名为 myDynamicIndex
的Atlas Search索引:
siv.drop_one("myDynamicIndex");
更多信息
要查看演示如何管理索引的可运行示例,请参阅 使用索引优化查询。
有关如何使用Atlas Search功能和定义Atlas Search索引的更详细指南,请参阅以下Atlas Search文档页面:
API 文档
要学习;了解有关本指南中讨论的方法的更多信息,请参阅以下API文档: