【问题标题】:mongo text search using $text is not working使用 $text 的 mongodb 文本搜索不起作用
【发布时间】:2016-02-27 18:13:11
【问题描述】:

我正在尝试使用索引和 $text 进行 mongo 文本搜索

我的模型是

var authorSchema = new mongoose.Schema(
    {
        authorId : Number,
        Description : String,
        firstName : String
    });

authorSchema.index({ firstName: 'text'});

我正在为名字创建索引

当我如下所示进行搜索时

router.route('/search')
    .get(function(req,res){
        Authors.find({ $text : { $search : req.params.search }},{"_id":0,"firstName":1},function(err,authors){
            res.send(authors);
        })
    })

搜索似乎没有提供预期的结果,即,

我在集合中有两个文档,名字是 kumar 和 sam kumar *当我搜索 kumar 搜索将得到两个文件 *当我搜索 sam kumar 时,我将再次获得似乎不正确的两个文档,预期搜索只是 sam kumar

我做错了什么

请说当我搜索整个名字时我该如何完成搜索 搜索应该只返回单个文档

【问题讨论】:

  • 确保索引已经创建。启动 Mongo Shell,并通过db.collection_name.getIndexes()获取您收藏的索引

标签: mongodb text full-text-search


【解决方案1】:

看起来您正在尝试查找短语,在您的情况下 sam kumar 并尝试查找包含完整短语的文档。

在这种情况下,用双引号 (") 将您的短语括起来

例如

var phrase = "\"" + req.params.search + "\"";

Authors.find({ $text : { $search : phrase }},{"_id":0,"firstName":1},function(err,authors){
        res.send(authors);

这应该返回你所期望的。

这里是说明如何搜索短语的文档。 请看https://docs.mongodb.org/manual/reference/operator/query/text/#phrases

上面的 snipes 假设您正在搜索一个完整的短语 sam kumar。但是,如果要匹配文档中任何位置同时存在 samkumar 的所有文档,则需要计算文本分数并过滤分数为 1 或更多。

请参考https://docs.mongodb.org/manual/tutorial/text-search-in-aggregation/#match-on-text-score

【讨论】:

  • 不。那将是var phrase = "\\\"" + req.params.search + "\\\"";,因为“\”是字符串的转义字符,并且在其自身和" 之前都需要被插值。您输入的内容会将phrase 变量设置为"+req.params.search+",而不是\"Sam Kumar\",这将使用变量值。
  • @BlakesSeven,我猜你无意中输入了两个额外的 `\\`
  • 当然可以。这是一个esape角色。因此,当您希望在用" 引用的字符串中包含字符“\”或" 时,您需要在您想要的实际字符前面加上一个转义字符。当然,在很多语言中通常是“\”,当然对于 JavaScript 也是如此。顺便说一句,斜线周围的引号"" 只是为了让它脱颖而出,你只需使用斜线。它也是本网站代码引用中的转义字符。因此,为什么在我的评论中没有这样标记。
猜你喜欢
  • 2021-10-13
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 2016-08-05
相关资源
最近更新 更多