全文search与重量在mongoose

据我所知,从3.8.9版本开始,mongoose支持全文search。 但我找不到一个好的文档!
我想做一些事情:

db.collection.ensureIndex( // Fields to index { animal: "text", color: "text", pattern: "text", size: "text" }, // Options { name: "best_match_index", // Adjust field weights (default is 1) weights: { animal: 5, // Most relevant search field size: 4 // Also relevant } } ) 

我可以用纯mongoose做到吗? 或者我必须使用一些像mongoose-text-search的插件? 如果没有重量?
我该怎么做?

是的,您可以在Mongoose> = 3.8.9中使用全文search。 首先,一个集合最多只能有一个文本索引(参见文档 )。 所以,要为几个字段定义文本索引,您需要复合索引:

 schema.index({ animal: 'text', color: 'text', pattern: 'text', size: 'text' }); 

现在你可以使用$ text查询运算符 :

 Model .find( { $text : { $search : "text to look for" } }, { score : { $meta: "textScore" } } ) .sort({ score : { $meta : 'textScore' } }) .exec(function(err, results) { // callback }); 

这也将按相关性分数sorting结果。

至于权重 ,您可以尝试将权重选项对象传递给index()方法(您可以在其中定义复合索引)(至less与mongoose的v4.0.1一起工作):

 schema.index({ animal: 'text', color: 'text', pattern: 'text', size: 'text' }, {name: 'My text index', weights: {animal: 10, color: 4, pattern: 2, size: 1}}); 

从MongoDB 2.6开始,一个集合最多只能有一个文本索引( 这里logging )。 因此,您将无法使用当前版本的MongoDB进行操作。 实际上,对于根据匹配位置的不同权重要求的复杂文本search问题,您应该考虑一个全面的文本search解决scheme,如Solr或ElasticSearch。

作为MongoDB的解决方法,您可以手动标记字段,将它们存储为关键字数组,并将它们编入索引:

 animal: ["The", "quick", "brown", "fox", "jump", ..., "dog"] 

然后像一个查询

db.test.find({动物:{$ in:[“brown”,“shoes”]})

模仿文本search。 这种方法存在一些局限性,例如需要进行手动设置,不会产生例如与“梦”相匹配的“梦”,事实上停用词不会像在正常的文本索引,没有任何权重机制。

我发现下面的文章,导致我到http://code.tutsplus.com/tutorials/full-text-search-in-mongodb–cms-24835我放弃了在顶部的答案创build索引使用以下;

 db.tablename.dropIndex({"indexname_text"}) 

我用这个命令得到了索引列表

 db.tablename.getIndexes() 

然后,我使用以下来创build索引

 db.tablename.createIndex({"$**":"text"}) 

下面的命令在Mongoose中工作

 model.find( {$text: {$search: "text you are searching for"}}, {score: {$meta: "textScore"}}) .sort({score:{$meta:"textScore"}} ) .exec(function(err, results) { `enter code here`if(!err){ console.log('results ' + results); } else { console.log(err); } }); 
  var searchQuery=new RegExp('dam', 'i'); var query = { firstName : searchQuery }; Model.find(query ... 
Interesting Posts