On this page
聚合管道中的文本搜索
在本页面
2.6 版的新功能。
在聚合管道中,可以通过在$match阶段使用$text查询运算符来进行文本搜索。
Restrictions
有关$text操作员的一般限制,请参见operator restrictions。
此外,聚合管道中的文本搜索具有以下限制:
text
运算符在该阶段只能出现一次。
Text Score
$text运算符为在索引字段中包含搜索词的每个文档分配一个分数。分数表示文档与给定文本搜索查询的相关性。分数可以是$sort管道规范的一部分,也可以是投影表达式的一部分。 { $meta: "textScore" }
表达式提供有关$text操作处理的信息。有关访问得分以进行投影或排序的详细信息,请参见$meta聚合。
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表达式。以下示例对术语cake
或tea
进行匹配,以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阶段之后的投影,排序和条件。
下面的示例匹配术语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 } } }
]
)
指定用于文本搜索的语言
以下聚合以西班牙语搜索在$match阶段中包含术语saber
但不包含claro
的文档,并在$group阶段中为匹配的文档计算总计views
。
db.articles.aggregate(
[
{ $match: { $text: { $search: "saber -claro", $language: "es" } } },
{ $group: { _id: null, views: { $sum: "$views" } } }
]
)