执行文本搜索(自管理部署)
注意
本页介绍了自托管(非 Atlas)部署的文本查询功能。对于托管在 MongoDB Atlas 上的数据,MongoDB 提供了一种改进的全文查询解决方案, Atlas Search。
要对自管理部署运行文本搜索查询,您的集合上必须有文本索引。 MongoDB提供文本索引来支持对string内容的文本搜索查询。 文本索引可以包括值为string或string元素大量的任何字段。 一个集合只能有一个文本搜索索引,但该索引可以涵盖多个字段。
有关文本索引的完整参考,包括行为、分词和属性,请参阅“自管理部署上的文本索引”部分。
示例
本示例演示了如何建立文本索引,并利用它查找仅有文本字段的咖啡店。
创建集合
创建一个包含以下文档的集合 stores
:
db.stores.insertMany( [ { _id: 1, name: "Java Hut", description: "Coffee and cakes" }, { _id: 2, name: "Burger Buns", description: "Gourmet hamburgers" }, { _id: 3, name: "Coffee Shop", description: "Just coffee" }, { _id: 4, name: "Clothes Clothes Clothes", description: "Discount clothing" }, { _id: 5, name: "Java Shopping", description: "Indonesian goods" } ] )
创建文本索引
在 mongosh
中执行以下命令,以允许对 name
和 description
字段进行文本搜索:
db.stores.createIndex( { name: "text", description: "text" } )
搜索确切的短语
您还可以用双引号将短语引起来以搜索确切的短语。如果 $search
字符串包含短语和单个术语,文本搜索仅匹配包含该短语的文档。
例如,以下命令将查找包含“coffee shop”的所有文档:
db.stores.find( { $text: { $search: "\"coffee shop\"" } } )
有关更多信息,请参阅短语。
排除词语
要排除某个单词,可以在前面加上“-
”字符。例如,要查找所有包含“java”或“shop”但不包含“coffee”的商店,请使用以下命令:
db.stores.find( { $text: { $search: "java shop -coffee" } } )
对结果进行排序
默认, MongoDB以未排序的顺序返回结果。 但是, $text
查询会计算每个文档的相关性分数,该分数指定文档与查询的匹配程度。
要按相关性分数顺序对结果进行排序,您必须显式投影 $meta
textScore
字段并按该字段进行排序:
db.stores.find( { $text: { $search: "java coffee shop" } }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } )
$text
也可在聚合管道中使用。