Docs 菜单
Docs 主页
/
监控集群
/

使用MongoDB Search 进行全文正则表达式查询

如果您的查询依赖于低效的正则表达式匹配,请使用 聚合管道阶段创建并运行 MongoDB搜索查询,以提高文本查询的性能,该查询有更多用于自定义查询参数的选项。$search

如果您经常运行不区分大小写的正则表达式查询(使用i 选项),我们建议使用带有 聚合管道阶段的 MongoDB搜索查询 $search

您可以在索引上指定 排序规则,以定义特定于语言的字符串比较规则,例如字母大小写和重音符号规则。但是,与MongoDB Search 查询相比,排序规则可能会导致某些功能丢失。在非MongoDB Search 环境中,不区分大小写的索引不会提高正则表达式查询的性能。$regex查询运算符不支持排序规则,因此无法有效使用案例不区分大小写的索引。MongoDB Search 索引显着提高了区分大小写查询的性能,并提供了更多用于自定义查询参数的选项。

考虑包含以下文档的 employees 集合:除了默认的 _id 索引之外,此集合没有其他索引:

// employees collection
{
"_id": 1,
"first_name": "Hannah",
"last_name": "Simmons",
"dept": "Engineering"
},
{
"_id": 2,
"first_name": "Michael",
"last_name": "Hughes",
"dept": "Security"
},
{
"_id": 3,
"first_name": "Wendy",
"last_name": "Crawford",
"dept": "Human Resources"
},
{
"_id": 4,
"first_name": "MICHAEL",
"last_name": "FLORES",
"dept": "Sales"
}

如果您的应用程序经常查询 first_name字段,您可能需要运行不区分大小写的正则表达式查询,以便更轻松地找到匹配的名称。不区分大小写的正则表达式还会匹配不同的数据格式,如上面的示例中,您同时拥有“Michael”和“MICHAEL”的 first_names。但是,我们建议使用 聚合管道阶段的MongoDB搜索查询。$search

如果用户搜索字符串“michael”,应用程序可能会运行以下查询:

db.employees.find( { first_name: { $regex: /michael/i } } )

由于此查询指定 $regex 选项 i,因此不区分大小写。该查询返回以下文档:

{ "_id" : 2, "first_name" : "Michael", "last_name" : "Hughes", "dept" : "Security" }
{ "_id" : 4, "first_name" : "MICHAEL", "last_name" : "FLORES", "dept" : "Sales" }

尽管此查询确实返回了预期的文档,但没有索引支持的不区分大小写的正则表达式查询的性能不是很高。要提高性能,请创建MongoDB Search索引:

{
"mappings": {
"dynamic": true
}
}

排序规则 会造成一些功能损失。当索引的 collation 文档的 strength 字段为 12 时,该索引不区分大小写。有关排序规则文档和不同 strength 值的详细描述,请参阅排序规则文档

对于要使用不区分大小写索引的应用程序,还必须在正则表达式查询中指定与索引相同的文档排序规则。虽然您可以从以前的 方法中删除$regex find()操作符并使用新创建的索引,但我们建议您使用带有 聚合管道阶段的 MongoDB搜索查询 $search

不区分大小写的查询
MongoDB搜索查询
db.employees.find( { first_name: "michael" } ).collation( { locale: 'en', strength: 2 } )
db.employees.aggregate([
{
$search: {
"index": "default",
"text": {
"path": "first_name",
"query": "michael"
}
}
}
])

重要

在查询中使用不区分大小写的索引时,请勿使用 $regex操作符。$regex实施不支持排序规则,也无法利用不区分大小写的索引。相反,我们建议使用 聚合管道阶段的MongoDB Search $search查询。

  • 要学习;了解有关MongoDB Search 查询的更多信息,请参阅查询和索引。

  • 要通过说明性示例了解有关不区分大小写的索引的更多信息,请参阅不区分大小写的索引

  • 要了解有关 MongoDB 中正则表达式查询的更多信息,请参阅$regex。

  • MongoDB University 提供有关优化 MongoDB 性能的免费课程。 要了解更多信息,请参阅监控和见解。

在此页面上