“文档” 菜单
文档首页
/
MongoDB Manual
/ / /

创建通配符文本索引

在此页面上

  • 关于此任务
  • 开始之前
  • 步骤
  • 结果
  • 搜索单个单词
  • 搜索多个术语
  • 搜索确切的短语
  • 了解详情

您可以创建一个文本索引,其中包含集合中具有字符串数据的每个文档字段。这些文本索引称为通配符文本索引。通配符文本索引支持对未知字段、任意字段或动态生成的字段进行文本搜索

要创建通配符文本索引,请将索引键设置为通配符说明符 ( $** ) 并将索引值设置为text

db.<collection>.createIndex( { "$**": "text" } )

通配符文本索引与通配符索引不同。通配符文本索引支持使用$text操作符的查询,而通配符索引不支持。

注意

$text 为自管理(非 Atlas)部署提供文本查询功能。对于 MongoDB Atlas 上托管的数据,MongoDB 提供改进的全文查询解决方案: Atlas Search。

创建通配符文本索引后,插入或更新文档时,索引会更新以包含任何新的字符串字段值。因此,通配符文本索引会对插入和更新的性能产生负面影响。

仅当要索引的字段未知或可能更改时,才使用通配符文本索引。通配符文本索引在特定字段上的性能不如目标文本索引。如果您的集合包含阻止目标索引的任意字段名称,请考虑重新建模您的模式以具有一致的字段名称。要了解有关目标索引的更多信息,请参阅创建索引以支持查询。

使用以下文档创建 blog 集合:

db.blog.insertMany( [
{
_id: 1,
content: "This morning I had a cup of coffee.",
about: "beverage",
keywords: [ "coffee" ]
},
{
_id: 2,
content: "Who likes chocolate ice cream for dessert?",
about: "food",
keywords: [ "poll" ]
},
{
_id: 3,
content: "My favorite flavors are strawberry and coffee",
about: "ice cream",
keywords: [ "food", "dessert" ]
}
] )

blog集合上创建通配符文本索引:

db.blog.createIndex( { "$**": "text" } )

通配符文本索引支持对集合中所有字段进行搜索查询。考虑以下查询:

查询blog集合中的字符串coffee

db.blog.find( { $text: { $search: "coffee" } } )

输出:

[
{
_id: 1,
content: 'This morning I had a cup of coffee.',
about: 'beverage',
keywords: [ 'coffee' ]
},
{
_id: 3,
content: 'My favorite flavors are strawberry and coffee',
about: 'ice cream',
keywords: [ 'food', 'dessert' ]
}
]

前面的查询返回在任何字段中包含字符串coffee的所有文档。

查询blog集合中包含字符串pollcoffee的文档:

db.blog.find( { $text: { $search: "poll coffee" } } )

输出:

[
{
_id: 1,
content: 'This morning I had a cup of coffee.',
about: 'beverage',
keywords: [ 'coffee' ]
},
{
_id: 3,
content: 'My favorite flavors are strawberry and coffee',
about: 'ice cream',
keywords: [ 'food', 'dessert' ]
},
{
_id: 2,
content: 'Who likes chocolate ice cream for dessert?',
about: 'food',
keywords: [ 'poll' ]
}
]

前面的查询返回在任何字段中包含字符串 pollcoffee 的文档。

查询blog集合中包含短语chocolate ice cream的文档:

db.blog.find( { $text: { $search: "\"chocolate ice cream\"" } } )

输出:

[
{
_id: 2,
content: 'Who likes chocolate ice cream for dessert?',
about: 'food',
keywords: [ 'poll' ]
}
]

前面的查询返回在任何字段中包含确切短语chocolate ice cream的文档。

  • 要了解如何控制文本查询结果的排名,请参阅为文本搜索结果分配权重。

  • 您可以将通配符文本索引作为复合文本索引的一部分。要了解有关复合文本索引的更多信息,请参阅创建复合文本索引。

  • 如要查看文本搜索查询的示例,请参阅 $text

    注意

    $text 为自管理(非 Atlas)部署提供文本查询功能。对于 MongoDB Atlas 上托管的数据,MongoDB 提供了改进的全文查询解决方案Atlas Search。

  • 要了解有关区分大小写等文本索引属性的信息,请参阅文本索引属性。

← 创建文本索引