对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

关于自管理部署的文本搜索

注意

本页介绍自托管(非 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" },
{ _id: 6, name: "NYC_Coffee Shop", description: "local NYC coffee" }
]
)

mongosh 中执行以下命令,以允许对 namedescription 字段进行文本搜索:

db.stores.createIndex( { name: "text", description: "text" } )

您可以用双引号将多词字符串括起来,以搜索精确的多词字符串。文本搜索仅匹配包含整个字符串的文档。

示例,以下查询可查找包含字符串“coffee shop”的所有文档:

db.stores.find( { $text: { $search: "\"coffee shop\"" } } )

此查询返回以下文档:

[
{ _id: 3, name: 'Coffee Shop', description: 'Just coffee' },
{ _id: 6, name: 'NYC_Coffee Shop', description: 'local NYC coffee' }
]

除非指定,否则精确字符串搜索不区分大小写或变音符号。 示例,以下查询返回与上一个查询相同的结果:

db.stores.find( { $text: { $search: "\"COFFEé 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 也可在聚合管道中使用。

在此页面上