在自管理部署上创建文本索引
注意
本页介绍了自托管(非 Atlas)部署的文本查询功能。对于托管在 MongoDB Atlas 上的数据,MongoDB 提供了一种改进的全文查询解决方案, Atlas Search。
文本索引支持对包含字符串内容的字段进行文本搜索查询。文本索引可提高搜索字符串内容中特定单词或短语时的性能。
要创建文本索引,请使用 db.collection.createIndex()
方法。 要索引包含string或string元素大量的字段,请将string "text"
指定为索引键:
db.<collection>.createIndex( { <field1>: "text", <field2>: "text", ... } )
关于此任务
一个集合最多可以有一个文本索引。
Atlas Search(在 MongoDB Atlas 中可用)支持在单个集合上使用多个全文搜索索引。要了解更多信息,请参阅 Atlas Search 文档。
您可以在单个文本索引中对多个字段进行索引。 文本索引最多可包含32个字段。 要查看示例,请参阅创建复合文本索引。
开始之前
使用以下文档创建 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" ] } ] )
步骤
以下示例展示了如何:
创建单字段文本索引
在content
字段上创建文本索引:
db.blog.createIndex( { "content": "text" } )
该索引支持在 content
字段上进行文本搜索查询。例如,以下查询返回其中 content
字段包含 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' ] } ]
非索引字段上的匹配
{ "content": "text" }
索引仅包含content
字段,不返回非索引字段的匹配项。 示例,以下查询在 blog
集合中搜索string food
:
db.blog.find( { $text: { $search: "food" } } )
前面的查询未返回任何文档。尽管字符串 food
出现在文档 _id: 2
和 _id: 3
中,但它分别出现在字段 about
和 keywords
中。about
和 keywords
字段不包含在文本索引中,因此不会影响文本搜索查询结果。
创建复合文本索引
注意
在创建本示例中的索引之前,必须删除 blog
集合上所有现有的文本索引。
在 blog
集合的 about
和 keywords
字段上创建复合文本索引:
db.blog.createIndex( { "about": "text", "keywords": "text" } )
该索引支持对 about
和 keywords
字段进行文本搜索查询。例如,以下查询返回字符串 food
出现在 about
或 keywords
字段中的文档:
db.blog.find( { $text: { $search: "food" } } )
输出:
[ { _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' ] } ]