使用Mongoose在Node JS中进行全文搜索

时间:2016-11-25 14:10:21

标签: javascript node.js mongodb mongoose full-text-search

我正在尝试对Mongoose中的字符串数组执行全文搜索,我收到此错误:

{ [MongoError: text index required for $text query]
  name: 'MongoError',
  message: 'text index required for $text query',
  waitedMS: 0,
  ok: 0,
  errmsg: 'text index required for $text query',
  code: 27 }

但是,我确实在用户架构的字段上声明了文本索引,并且我确认已创建文本索引,因为我使用的是mLab。 我正在尝试对字段执行全文搜索

这是我的用户架构:

var userSchema = mongoose.Schema({
        local: {
            firstName: String,
            lastName: String,
            username: String,
            password: String,
            fields: {type: [String], index: true}
        }
});

以下是我的全文搜索代码:

User.find({$text: {$search: search}}, function (err, results) {
                if (err) {
                    console.log(err);
                } else {
                    console.log(results);
                }
        });

3 个答案:

答案 0 :(得分:8)

要使$text个查询起作用,mongodb需要使用文本索引为该字段编制索引。要通过mongoose使用

创建此索引
fields: {type: [String], text: true}

See here用于文本索引的mongodb文档。

答案 1 :(得分:4)

您需要为您的架构添加文本索引,如下所示:

userSchema.index({fields: 'text'});

如果您想要包含所有字符串字段

,请使用userSchema.index({'$**': 'text'});

答案 2 :(得分:0)

如果由于某种原因无法添加测试索引,则还可以在聚合管道中使用regex运算符来匹配字符串。

$ regex

提供用于模式匹配字符串的正则表达式功能 在查询中。
MongoDB使用与Perl兼容的正则表达式(即 支持UTF-8的“ PCRE”)版本8.42。

要使用$ regex,请使用以下其中一项 以下语法:

{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ <field>: { $regex: 'pattern', $options: '<options>' } }
{ <field>: { $regex: /pattern/<options> } }

在MongoDB中,您还可以使用正则表达式对象(即 / pattern /)指定正则表达式:

{ <field>: /pattern/<options> }