聚合管道中的全文检索


进入MongoDB中文手册(4.2版本)目录

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

1 限制条件

有关常规$text运算符限制,请参见运算符限制(operator restrictions)。
此外,聚合管道中的全文检索具有以下限制:

  • 包含$text的$match阶段必须是管道中的第一阶段;
  • 一个text运算符在该阶段只能出现一次;
  • text运算符表达式不能出现在$or或$not表达式中;
  • 默认情况下,全文不会按匹配分数的顺序返回匹配的文档。但是可以在$sort阶段中使用$meta聚合表达式。

2 文本分数

$text运算符为包含索引字段中的词语的每个文档分配得分。分数表示文档与给定文本搜索查询的相关性。分数可以是$sort管道规范的一部分,也可以是投影表达式的一部分。
{ $meta: “textScore” }表达式提供有关$text运算符的信息。有关访问投影或排序分数的详细信息,请参见 m e t a 聚 合 。 元 数 据 ( m e t a d a t a ) 仅 在 包 含 meta聚合。 元数据(metadata )仅在包含 metametadatatext运算符的$match阶段之后可用。

3 示例

以下示例表示在articles集合的subject字段上创建文本索引的:

db.articles.createIndex( { subject: "text" } )

3.1 计算包含一个单词的Articles 集合的总视图( Total Views)

以下在$match阶段中聚合搜索cake语句并计算$group阶段中匹配文档的总视图。

db.articles.aggregate(
   [
     { $match: { $text: { $search: "cake" } } },
     { $group: { _id: null, views: { $sum: "$views" } } }
   ]
)

3.2 返回结果按文本分数排序

要按文本分数排序,请在$sort阶段中包括一个$meta 表达式。下面的示例匹配cake或tea,以文本分数降序排序,并且在结果中仅返回title字段。

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

指定的元数据(metadata )确定排序顺序。例如,元数据"textScore"按降序排序。请参阅参考$metal,以获取有关$meta的更多信息,和覆盖元数据默认排序顺序的示例。

3.3 文本分数匹配

元数据"textScore"可用于投影,排序,以及包括 t e x t 运 算 符 的 text运算符的 textmatch阶段的之后的条件。
以下示例匹配cake或tea字段,对title和score字段进行投影,然后仅返回score大于1.0的文档。

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

3.4 用于全文检索的语言的指定

以下聚合搜索在 m a t c h 阶 段 中 查 询 包 含 s a b e r 但 不 包 含 c l a r o 的 西 班 牙 语 文 档 , 并 在 match阶段中查询包含saber但不包含claro的西班牙语文档,并在 matchsaberclaro西group阶段中计算匹配文档的总视图(total views)。

db.articles.aggregate(
   [
     { $match: { $text: { $search: "saber -claro", $language: "es" } } },
     { $group: { _id: null, views: { $sum: "$views" } } }
   ]
)


进入MongoDB中文手册(4.2版本)目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值