Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

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

在此页面上

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

MongoDB为 MongoDB Atlas 上托管的数据提供高级全文搜索解决方案MongoDB Atlas Search 传统文本搜索功能可供自我管理MongoDB部署的用户使用。

在聚合管道中,可以通过在 $match 阶段使用 $text 查询操作符来执行文本搜索。

有关一般 $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