聚合管道中的文本搜索

在本页面

2.6 版的新功能。

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

Restrictions

有关$text操作员的一般限制,请参见operator restrictions

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

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

  • text运算符在该阶段只能出现一次。

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

  • 默认情况下,文本搜索不会按匹配分数的 Sequences 返回匹配的文档。在$sort阶段使用$meta聚合表达式。

Text Score

$text运算符为在索引字段中包含搜索词的每个文档分配一个分数。分数表示文档与给定文本搜索查询的相关性。分数可以是$sort管道规范的一部分,也可以是投影表达式的一部分。 { $meta: "textScore" }表达式提供有关$text操作处理的信息。有关访问得分以进行投影或排序的详细信息,请参见$meta聚合。

元数据仅在包含$text操作的$match阶段之后可用。

Examples

以下示例假定集合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表达式。以下示例对术语caketea进行匹配,以textScore降序排序,并且仅返回结果集中的title字段。

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

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

Literals 分数匹配

"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但不包含claro的文档,并在$group阶段中为匹配的文档计算总计views