在自管理部署上创建通配符文本索引
您可以创建一个文本索引,其中包含集合中具有string数据的每个文档字段。 这些文本索引称为通配符文本索引。 通配符文本索引支持对未知字段、任意字段或动态生成的字段进行文本搜索。
要创建通配符文本索引,请将索引键设置为通配符说明符 ( $**
) 并将索引值设置为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
集合中的string 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' ] } ]
前面的查询返回在任何字段中包含string coffee
的所有文档。
搜索多个术语
查询 blog
集合中包含string poll
或coffee
的文档:
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' ] } ]
前面的查询返回在任何字段中包含字符串 poll
或 coffee
的文档。
搜索确切的短语
查询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。要学习;了解区分大小写等文本索引属性,请参阅自管理部署上的文本索引属性。