MongoDB / Node.js-mongoose-text-search中的全文搜索

时间:2013-11-08 00:45:19

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

我正在尝试使用mongoose-text-search插件对MongoDB和Node.js执行全文搜索。我正在关注https://github.com/aheckmann/mongoose-text-search的示例代码,我的代码如下所示。我一直收到错误声明: “错误:未启用文本搜索。  未定义” 我按照Installing plugins for mongoose - getting error的指示进入了MongoDB网站:http://docs.mongodb.org/manual/tutorial/enable-text-search。 但是,在我通过键入命令启用文本搜索后:

mongod --setParameter textSearchEnabled = true

在终端,我启动我的应用程序并遇到一个额外的错误。它指出: “MongoError:E11000重复键错误索引:meddb.tweets。$ id_1 dup key:{:null} 这是错误:错误:未启用文本搜索 未定义“

如果您有任何人遇到此错误并找到解决办法,请告诉我我缺少或需要更改的内容。

var mongoose = require('mongoose');
var textSearch = require('mongoose-text-search');
var Schema = mongoose.Schema;
var twitterSchema = new Schema ({
        id: {type: Number, index: {unique: true, dropDups: true}},
        created_at: Date,
        user: [{
                id: Number,
                name: String,
                screen_name: String,
                location: String
        }],
        text: String,
        keywords: []
});

twitterSchema.plugin(textSearch);

twitterSchema.index({keywords: 'text' });

var Tweets = mongoose.model('Tweets', twitterSchema);

Tweets.create({text: 'flu', keywords: ['disease', 'doctor', 'shots']}, function(err){
    if(err){
        console.log('First error: ' + err);
    }

    Tweets.textSearch('shots', function(err, output){
        if(err){
            console.log('This is error: ' + err)
        }

        var inspect = require('util').inspect;
        console.log(inspect(output, {depth: null}));

   });
});

exports.Document = function(db) {
  return db.model('Tweets');
};

1 个答案:

答案 0 :(得分:5)

mongoose-text-search插件正在为我工​​作。我必须将textSearchEnabled设置为true。我没有在启动时尝试将其作为参数,但是一旦我的mongod实例已经运行,这就起作用了:

use admin
db.runCommand({'setParameter':1,"textSearchEnabled":true})
use <my db>
<my db>.<my colleciton>.ensureIndex({"$**":"text"}) //Beware! "$**" indexes the entire document

另外,您真的可能要考虑使用Elasticsearch而不是Mongo的FTS。 Mongo的FTS解决方案是not production ready参见警告)。我对Elasticsearch的经验也很有限,但发现它非常令人印象深刻。

如果您选择使用Elasticsearch路线但仍想使用Mongo,那么有一些不错的选择:

  • 一个river,需要启用replica set 所以河流可以监控oplog(参见wiki
  • Mongoosastic,它可以很好地插入Mongoose进行查询,并通过写入Mongo和ES来保持ES与Mongo同步。

<强>更新 由于2.6 Mongo默认启用了文本搜索。