Docs 菜单
Docs 主页
/ /

MongoDB搜索索引

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,然后为 dbcollection 变量分配以下值:

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 索引交互的成员函数:

  • create_one():使用指定配置创建MongoDB Search索引

  • create_many():使用指定配置创建多个MongoDB Search 索引

  • list():返回一个 mongocxx::cursor实例,该实例指向集合上的MongoDB Search 索引列表

  • update_one():更新指定MongoDB Search索引的定义

  • drop_one() :从集合中删除指定索引

注意

MongoDB Search 索引管理是异步的

MongoDB C++驱动程序异步管理MongoDB Search 索引。以下部分中描述的库方法会立即返回服务器响应,但对MongoDB搜索索引的更改会在背景进行,可能要稍后一段时间才能完成。

以下部分提供的代码示例演示了如何使用每种MongoDB Search索引管理方法。

要在集合上创建单个MongoDB Search索引,请在 mongocxx::search_index_view实例上调用 create_one() 方法,并传入指定要创建索引的 mongoxcc::search_index_model实例。

mongocxx::search_index_model 构造函数需要以下参数:

  • name:指定索引索引的字符串

  • definition:包含 mappings字段的文档,指定如何配置索引中的字段

提示

有关可在MongoDB Search索引中配置的字段的完整列表,请参阅MongoDB Search 文档中的“查看MongoDB Search 索引事务语法”指南。

以下部分介绍如何创建使用静态或动态映射的单个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 Search 文档中的“静态映射”部分。

在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 Search 文档中的动态映射部分。

要创建多个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 索引,请在 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索引,请在 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 Search索引,请在 mongocxx::search_index_view实例上调用 drop_one() 方法并传入要删除的索引的名称。

以下示例展示如何删除名为 myDynamicIndex 的MongoDB搜索索引:

siv.drop_one("myDynamicIndex");

要查看演示如何管理索引的可运行示例,请参阅 使用索引优化查询。

有关如何使用MongoDB搜索功能和定义MongoDB搜索索引的更详细指南,请参阅以下MongoDB搜索文档页面:

要学习;了解有关本指南中讨论的方法的更多信息,请参阅以下API文档:

后退

复合索引

在此页面上