Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

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

在此页面上

  • 限制
  • 文本分数
  • 举例
  • $search Atlas Search 中的阶段

注意

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

在聚合管道中,可通过在$text $match阶段使用 查询运算符来进行文本搜索。

有关一般$text操作符限制,请参阅操作符限制。

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

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

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

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

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

$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"} 表达式。以下示例匹配词语 caketea,按 textScore 降序排序,并仅返回结果集中的 title 字段。

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

指定的元数据用于决定排序顺序。例如,"textScore" 元数据按降序排序。有关元数据的更多信息以及覆盖元数据默认排序顺序的示例,请参见 $meta

"textScore"元数据可用于包含$text操作的$match阶段后续的投影、排序和条件。

以下示例匹配词语 caketea,投影 titlescore 字段,然后仅返回 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" } } }
]
)

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

后退

$text