Docs 菜单
Docs 主页
/
MongoDB Atlas
/ /

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

在此页面上

  • 避免低效正则表达式匹配
  • 例子
  • 了解详情

如果您的查询依赖于低效的正则表达式匹配,请创建并运行具有 $search 聚合管道阶段的 Atlas Search 查询,这样可以提升文本查询的性能,因为这些查询提供了更多的选项来自定义查询参数。

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

您可以在索引上指定 排序规则,以定义特定于语言的string比较规则,例如字母大小写和重音符号规则。 但是,与 Atlas Search 查询 相比, 排序规则 可能会导致某些功能损失。在非 Atlas Search 环境中,不区分大小写的索引不会提高 regex 查询的性能。 $regex查询运算符不支持排序规则,因此无法有效使用不区分大小写的索引。 Atlas 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。但是,我们建议使用 $search 聚合管道阶段的 Atlas 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" }

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

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

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

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

不区分大小写的查询
Atlas Search 查询
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 实现不支持排序规则,也无法利用不区分大小写的索引。我们建议改用 $search 聚合管道阶段的 Atlas Search 查询。

  • 要了解有关 Atlas Search 查询的更多信息,请参阅创建和运行 Atlas Search 查询。

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

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

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

后退

搜索性能