使用 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
字段为 1
或 2
时,该索引不区分大小写。有关排序规则文档和不同 strength
值的详细描述,请参阅排序规则文档。
对于要使用不区分大小写索引的应用程序,您还必须在正则表达式查询中指定与索引相同的排序规则文档。虽然您可以从之前的 find()
方法中移除 $regex
操作符并使用新创建的索引,但我们还是建议您采用带有 $search 聚合管道阶段的 Atlas Search 查询。
不区分大小写的查询 | Atlas Search 查询 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
重要
在查询中使用不区分大小写的索引时,请勿使用 $regex 操作符。$regex
实现不支持排序规则,也无法利用不区分大小写的索引。我们建议改用 $search 聚合管道阶段的 Atlas Search 查询。
了解详情
要了解有关 Atlas Search 查询的更多信息,请参阅创建和运行 Atlas Search 查询。
要通过说明性示例了解有关不区分大小写的索引的更多信息,请参阅不区分大小写的索引。
要了解有关 MongoDB 中正则表达式查询的更多信息,请参阅$regex。
MongoDB University 提供有关优化 MongoDB 性能的免费课程。 要了解更多信息,请参阅监控和见解。