“文档” 菜单
文档首页
/
MongoDB 阿特拉斯
/ /

使用 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值的详细说明,请参阅排序规则文档。

对于要使用不区分大小写索引的应用程序,您还必须在正则表达式查询中指定与索引 相同 的文档排序规则。虽然您可以从以前的 方法中删除$regex find()操作符并使用新创建的索引,但我们建议您使用带有 $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 性能的免费课程。 要了解更多信息,请参阅监控和见解。

后退

搜索性能

来年

混合搜索