自管理部署聚合管道中的 $text
注意
本页介绍了自托管(非 Atlas)部署的文本查询功能。对于托管在 MongoDB Atlas 上的数据,MongoDB 提供了一种改进的全文查询解决方案, Atlas Search。
在聚合管道中,可以通过在 $match
阶段使用 $text
查询操作符来执行文本搜索。
限制
有关一般 $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" } } } ] )
返回按文本搜索分数排序的结果
要按文本搜索分数排序,请在 $sort
阶段包含 {$meta:
"textScore"}
表达式。以下示例匹配词语 cake
或 tea
,按 textScore
降序排序,并仅返回结果集中的 title
字段。
db.articles.aggregate( [ { $match: { $text: { $search: "cake tea" } } }, { $sort: { score: { $meta: "textScore" } } }, { $project: { title: 1, _id: 0 } } ] )
指定的元数据用于决定排序顺序。例如,"textScore"
元数据按降序排序。有关元数据的更多信息以及覆盖元数据默认排序顺序的示例,请参见 $meta
。
文本分数匹配
"textScore"
元数据可用于包含 $text
操作的 $match
阶段之后的投影、排序和条件。
以下示例匹配词语 cake
或 tea
,投影 title
和 score
字段,然后仅返回 score
大于 1.0
的文档。
db.articles.aggregate( [ { $match: { $text: { $search: "cake tea" } } }, { $project: { title: 1, _id: 0, score: { $meta: "textScore" } } }, { $match: { score: { $gt: 1.0 } } } ] )
指定文本搜索的语言
以下聚合在 $match
阶段以西班牙语搜索包含词语 saber
的文档并计算 $group
阶段中匹配文档的 views
总计。
db.articles.aggregate( [ { $match: { $text: { $search: "saber -claro", $language: "es" } } }, { $group: { _id: null, views: { $sum: "$views" } } } ] )
$search
Atlas Search 中的阶段
对于托管在 MongoDB Atlas 上的数据,Atlas Search 提供了 $search 聚合阶段,可对集合执行全文检索。