Overview
MongoDB搜索功能使您能够对Atlas上托管的集合执行全文搜索。在执行MongoDB Search 查询之前,您必须创建索引,指定要索引的字段以及索引的方式。
要学习;了解有关MongoDB Search 的更多信息,请参阅MongoDB Search 文档中的 MongoDB Search 概述。
样本数据
本指南中的示例使用Atlas示例数据集的sample_mflix数据库中的 movies集合。 要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅Atlas入门指南。
要从C++应用程序管理sample_mflix集合上的MongoDB 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 Search 索引交互的成员函数:
list():返回一个
mongocxx::cursor实例,该实例指向集合上的MongoDB Search 索引列表drop_one() :从集合中删除指定索引
注意
MongoDB Search 索引管理是异步的
MongoDB C++驱动程序异步管理MongoDB Search 索引。以下部分中描述的库方法会立即返回服务器响应,但对MongoDB搜索索引的更改会在背景进行,可能要稍后一段时间才能完成。
以下部分提供的代码示例演示了如何使用每种MongoDB Search索引管理方法。
创建MongoDB搜索索引
要在集合上创建单个MongoDB Search索引,请在 mongocxx::search_index_view实例上调用 create_one() 方法,并传入指定要创建索引的 mongoxcc::search_index_model实例。
mongocxx::search_index_model 构造函数需要以下参数:
name:指定索引索引的字符串definition:包含mappings字段的文档,指定如何配置索引中的字段
以下部分介绍如何创建使用静态或动态映射的单个MongoDB搜索索引。
使用静态映射创建MongoDB搜索索引
在MongoDB Search索引中使用静态映射来指定要索引的字段,并为各个字段配置索引选项。
要创建使用静态映射的单个MongoDB Search索引,请先创建一个包含 mappings字段的 definition文档。在 mappings字段中,指定包含以下字段和值的文档:
dynamic:设置为false。fields:指定要索引的字段名称及其索引配置的文档。要学习;了解有关mappings.fields选项的更多信息,请参阅MongoDB Search 文档中的静态映射示例。
然后,将 name 字符串和 definition文档传递给 mongocxx::search_index_model 构造函数以实例化 mongocxx::search_index_model。将此 mongocxx::search_index_model实例传递给 create_one() 方法,以将指定的MongoDB Search索引添加到您的集合中。
以下示例展示了如何创建使用静态映射的单个MongoDB搜索索引:
// 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
重要
您无法对字段名称开头包含美元 ($) 符号的字段创建索引。
使用动态映射创建MongoDB搜索索引
在MongoDB Search索引中使用动态映射,自动为受支持类型的所有字段索引。有关支持的BSON数据类型的列表,请参阅MongoDB搜索文档中的数据类型部分。
要创建使用动态映射的单个MongoDB Search索引,请先创建一个包含 mappings字段的 definition文档。在 mappings字段中,指定包含 dynamic字段的文档,并将其值设立为 true。然后,将 name 字符串和 definition文档传递给 mongocxx::search_index_model 构造函数以实例化 mongocxx::search_index_model。将此 mongocxx::search_index_model实例传递给 create_one() 方法,以将指定的MongoDB Search索引添加到集合中。
以下示例展示了如何创建使用动态映射的单个MongoDB搜索索引:
// 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
创建多个MongoDB搜索索引
要创建多个MongoDB搜索索引,请对 mongocxx::search_index_view实例调用 create_many() 方法,并传入指定要创建的MongoDB搜索索引的 mongocxx::search_index_model 实例向量。
以下示例展示了如何创建多个MongoDB搜索索引:
// 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
列出MongoDB Search 索引
要列出集合上的MongoDB Search 索引,请在 mongocxx::search_index_view实例上调用 list() 方法。此方法返回一个 mongocxx::cursor实例,您可以使用该实例迭代集合的MongoDB Search 索引。
以下示例通过迭代指向创建多个MongoDB搜索索引中索引的{MongoDB}实例来打印 MongoDBcursor::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() 方法来列出特定的MongoDB 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 } }, ...}
更新MongoDB Search 索引
要更新MongoDB Search索引,请在 mongocxx::search_index_view实例上调用 update_one() 方法,并传入要更新的索引名称以及要更新到的索引的定义。
以下示例展示了如何更新使用静态映射创建搜索索引中的MongoDB搜索索引,以在 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());
删除MongoDB搜索索引
要从集合中删除MongoDB Search索引,请在 mongocxx::search_index_view实例上调用 drop_one() 方法并传入要删除的索引的名称。
以下示例展示如何删除名为 myDynamicIndex 的MongoDB搜索索引:
siv.drop_one("myDynamicIndex");
更多信息
要查看演示如何管理索引的可运行示例,请参阅 使用索引优化查询。
有关如何使用MongoDB搜索功能和定义MongoDB搜索索引的更详细指南,请参阅以下MongoDB搜索文档页面:
API 文档
要学习;了解有关本指南中讨论的方法的更多信息,请参阅以下API文档: