目录
进入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 )仅在包含
meta聚合。元数据(metadata)仅在包含text运算符的$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运算符的
text运算符的match阶段的之后的条件。
以下示例匹配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的西班牙语文档,并在 match阶段中查询包含saber但不包含claro的西班牙语文档,并在group阶段中计算匹配文档的总视图(total views)。
db.articles.aggregate(
[
{ $match: { $text: { $search: "saber -claro", $language: "es" } } },
{ $group: { _id: null, views: { $sum: "$views" } } }
]
)