文档菜单
文档首页
/
MongoDB 手册
/ /

执行文本搜索(自托管部署)

注意

本页面描述了自托管(非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中运行以下命令以允许在namedescription字段上进行文本搜索

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也适用于聚合管道。

返回

文本搜索