Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

限制在自管理部署上扫描的文本索引项数量

在此页面上

  • 关于此任务
  • 步骤
  • 结果
  • 查看已检查的文档数量
  • 了解详情

如果对大型数据集执行文本搜索查询,单字段文本索引可能会扫描大量条目以返回结果,这可能会导致查询速度变慢。

要提高查询性能,您可以创建复合文本索引,并在文本搜索查询中包含等值匹配。 如果复合索引包含等值匹配使用的字段,则索引扫描的条目更少,返回结果的速度更快。

在此示例中,商店经理查询包含这些文档的 inventory集合:

db.inventory.insertMany( [
{ _id: 1, department: "tech", description: "lime green computer" },
{ _id: 2, department: "tech", description: "wireless red mouse" },
{ _id: 3, department: "kitchen", description: "green placemat" },
{ _id: 4, department: "kitchen", description: "red peeler" },
{ _id: 5, department: "food", description: "green apple" },
{ _id: 6, department: "food", description: "red potato" }
] )

经理对特定部门内的项目执行文本搜索查询。

departmentdescription 字段上的复合文本索引将扫描的索引键限制为仅指定 department 内的文档。与 description 字段上的单字段文本索引相比,复合文本索引可提供更高的性能。

在包含以下字段的 inventory 集合上创建复合索引:

  • department 字段上的升序或降序索引键

  • description字段上的text索引键

db.inventory.createIndex(
{
department: 1,
description: "text"
}
)

创建复合索引后,文本搜索查询仅扫描与 department 字段上指定的相等条件匹配的文档。

例如,以下查询会扫描 department 等于 kitchen 的文档,其中 description 字段包含字符串 green

db.inventory.find( { department: "kitchen", $text: { $search: "green" } } )

输出:

[ { _id: 3, department: 'kitchen', description: 'green placemat' } ]

要查看扫描了多少个文档才返回查询,请查看查询的 executionStats

db.inventory.find(
{
department: "kitchen", $text: { $search: "green" }
}
).explain("executionStats")

检查的索引键数量显示在 totalKeysExamined 字段中。检查更多索引键的查询通常需要更长时间才能完成。

当复合索引位于 departmentdescription 时,查询仅检查 一个索引键。集合中只有一个 kitchendepartment 并且 description 包含字符串 green 的文档。

但是,如果查询仅对 description 字段使用单字段文本索引,则查询将检查三个索引键。集合中有三个文档,其中 description 字段包含字符串 green

在类似上例中的小型集合中,单字段和复合文本索引的性能差异并不明显。但是,在较大的集合中,增加索引项扫描会明显影响性能。为获得最佳性能,请创建限制扫描索引项数量的文本索引,以最好地适应等值匹配。

后退

分配权重