Text search_在聚集管道(Aggregation Pipeline)中使用文本搜索(Text Search)
-
聚集管道(Aggregation Pipeline)中的文本搜索(Text Search)
聚集管道操作中,可通过在$match阶段使用$text文本操作运算来实现文本搜索。限制
在聚集管道中进行的文本搜索有以下限制:
• $match阶段包含了$text, 且$text必须是管道(Pipeline)的第一步;
• $text操作符只能在一个阶段中出现一次;
• $text操作符不能出现在$or 或$not的表达式中;
• 默认情况下,文本搜索不会按匹配分数的顺序返回匹配文档。若要实现可选择在 $sort 阶段使用 $meta 聚合表达式;文本得分(Text Score)
操作符$text会对在索引字段中包含搜索词的每个文档打分 。所得分数反映了该文档与给定文本搜索查询的相关性。该分数就如同预测词(Projection Expression)一般,可以作为$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表达式。
以下例子中,查询匹配单词cake或tea的文档并以textScore按降序排序,最后在结果集中只返回title:
db.articles.aggregate( [ { $match: { $text: { $search: "cake tea" } } }, { $sort: { score: { $meta: "textScore" } } }, { $project: { title: 1, _id: 0 } } ] )
元数据决定了排序的顺序。例如,这里的元数据"textScore"按降序排序。若需了解更多元数据的信息,以及覆盖元数据默认排序顺序的示例,请参阅$meta。
- 匹配文本分数
元数据"textScore"可以用于排序,映射和$match阶段之后的条件,这里的$match阶段必须包含$text操作。
下例中,查询匹配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" } } } ] )
- 计算包含某个词的文章的总浏览量
-
原文网址:https://docs.mongodb.com/manual/tutorial/text-search-in-aggregation/