在自管理部署中聚合管道中的$text
注意
本页介绍了自管理(非 Atlas)部署的文本查询功能。对于托管在 MongoDB Atlas 上的数据,MongoDB 提供了改进的全文查询解决方案,Atlas Search 和向量搜索解决方案 Atlas Vector Search。
在聚合管道中,可以通过使用$text
查询操作符在 $match
阶段。
限制
有关通用 $text
操作符的限制,请参阅操作符限制。
此外,聚合管道中的文本搜索有以下限制
文本评分
$text
操作符为每个结果文档分配一个分数。该分数表示文档与给定查询的相关性。分数可以是 $sort
管道的一部分。规格以及投影表达式的一部分。表达式 { $meta: "textScore" }
提供了关于 $text
操作处理的详细信息。有关访问投影或排序分数的详细信息,请参阅 $meta
。
元数据仅在包含 $text
操作的 $match
阶段之后才可用。
示例
以下示例假设有一个名为 articles
的集合,该集合在 subject
字段上有文本索引。
db.articles.createIndex( { subject: "text" } )
计算包含单词的文档的总观看次数
以下聚合搜索在 $match
阶段中搜索术语 cake
,并在 $group
阶段中计算匹配文档的 views
总数。
db.articles.aggregate( [ { $match: { $text: { $search: "cake" } } }, { $group: { _id: null, views: { $sum: "$views" } } } ] )
按文本搜索评分排序结果
要按文本搜索评分排序,请在 {$meta: "textScore"}
表达式包含在 $sort
阶段。以下示例匹配 任一 术语 cake
或 tea
,按 textScore
降序排序,并仅返回结果集中的 title
字段。
db.articles.aggregate( [ { $match: { $text: { $search: "cake tea" } } }, { $sort: { score: { $meta: "textScore" } } }, { $project: { title: 1, _id: 0 } } ] )
指定的元数据确定排序顺序。例如,"textScore"
元数据按降序排序。有关元数据以及覆盖元数据默认排序顺序的示例,请参阅 $meta
。
按文本评分匹配
"textScore"
元数据适用于投影、排序以及 $match
阶段之后的条件,其中包含 $text
操作。
以下示例匹配 任一 术语 cake
或 tea
,投影 title
和 score
字段,然后仅返回评分大于 1.0
的文档。
db.articles.aggregate( [ { $match: { $text: { $search: "cake tea" } } }, { $project: { title: 1, _id: 0, score: { $meta: "textScore" } } }, { $match: { score: { $gt: 1.0 } } } ] )
指定文本搜索的语言
以下聚合搜索在西班牙语中搜索包含术语saber
但不含术语claro
的文档,并在$match
阶段计算匹配文档在$group
阶段的总视图
。
db.articles.aggregate( [ { $match: { $text: { $search: "saber -claro", $language: "es" } } }, { $group: { _id: null, views: { $sum: "$views" } } } ] )
$search
阶段在Atlas Search中
对于托管在MongoDB Atlas上的数据,Atlas Search提供了$search聚合阶段,以对您的集合进行全文搜索。