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

在自管理部署中聚合管道中的$text

本页内容

  • 限制
  • 文本分数
  • 示例
  • $search 阶段在 Atlas 搜索中

注意

本页介绍了自管理(非 Atlas)部署的文本查询功能。对于托管在 MongoDB Atlas 上的数据,MongoDB 提供了改进的全文查询解决方案,Atlas Search 和向量搜索解决方案 Atlas Vector Search

在聚合管道中,可以通过使用$text 查询操作符在 $match 阶段。

有关通用 $text 操作符的限制,请参阅操作符限制。

此外,聚合管道中的文本搜索有以下限制

  • 包含 $text$match 阶段必须是管道中的 第一个 阶段。

  • $text 操作符在每个阶段只能出现一次。

  • $text 操作符表达式不能出现在 $or$not 表达式中。

  • 默认情况下,$text 不按匹配分数顺序返回匹配的文档。要按降序排序,请使用 $meta 聚合表达式在 $sort 阶段。

$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 阶段。以下示例匹配 任一 术语 caketea,按 textScore 降序排序,并仅返回结果集中的 title 字段。

db.articles.aggregate(
[
{ $match: { $text: { $search: "cake tea" } } },
{ $sort: { score: { $meta: "textScore" } } },
{ $project: { title: 1, _id: 0 } }
]
)

指定的元数据确定排序顺序。例如,"textScore" 元数据按降序排序。有关元数据以及覆盖元数据默认排序顺序的示例,请参阅 $meta

"textScore" 元数据适用于投影、排序以及 $match 阶段之后的条件,其中包含 $text 操作。

以下示例匹配 任一 术语 caketea,投影 titlescore 字段,然后仅返回评分大于 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" } } }
]
)

对于托管在MongoDB Atlas上的数据,Atlas Search提供了$search聚合阶段,以对您的集合进行全文搜索。

返回

$text