执行文本搜索(自托管部署)
注意
本页面描述了自托管(非Atlas)部署的文本查询功能。对于托管在MongoDB Atlas上的数据,MongoDB提供了改进的全文查询解决方案,Atlas Search 和向量搜索解决方案 Atlas Vector Search。
要在自托管部署上运行文本搜索查询,您必须在您的集合上有一个文本索引。MongoDB提供文本索引以支持对字符串内容的文本搜索查询。文本索引可以包括任何值为字符串或字符串元素数组的字段。一个集合只能有一个 一个 文本搜索索引,但该索引可以涵盖多个字段。
有关文本索引的完整参考,包括行为、分词和属性,请参阅自托管部署上的文本索引部分。
示例
此示例演示了如何构建一个文本索引并使用它来查找咖啡店,前提是只有文本字段。
创建集合
创建一个集合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
字符串中包含短语和单个术语,文本搜索将仅匹配包含该短语的文档。
例如,以下将找到所有包含"咖啡店"的文档
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
也适用于聚合管道。