Docs 菜单

Docs 主页开发应用程序MongoDB Manual

聚合管道中的文本搜索

在此页面上

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

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

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

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

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

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

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

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

  • 默认情况下,文本搜索不会按匹配分数顺序返回匹配文档。要按分数降序排序,请在 $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聚合阶段来对集合执行全文搜索。

← 文本搜索操作符(自管理部署)