在MongoDB和Mongoose中执行全文搜索的最佳方法


76

几天以来,我一直在Google上进行搜索,并且尝试了很多操作,但是仍然无法对用户集合进行良好的全文搜索。

我尝试了ElasticSearch,但几乎无法查询和分页...

我尝试了许多用于Mongoose的插件,例如ElMongo,mongoose-full-text,Mongoosastic等...每个人的文档都非常糟糕,我不知道如何执行良好的全文本搜索。

因此,我的收藏是普通收藏:

user = {
  name: String,
  email: String,
  profile: {
    something: String,
    somethingElse: String
  }
}

我在一个简单的页面中有一个搜索输入POST,如果输入的hello world话,我需要在整个集合字段中搜索搜索查询的匹配词并获取结果。

还有很多选项可以处理分页,例如每页10个项目等等。

实现此目标的最佳解决方案是什么?我在Mongoose,NodeJS和ExpressJS中使用MongoDB 2.6。*。

谢谢。

Answers:


194

您可以在Mongoose模式定义中添加文本索引,以便$textfind查询中使用运算符搜索文本索引中包含的所有字段。

创建索引以支持文本搜索,例如nameprofile.something

var schema = new Schema({
  name: String,
  email: String,
  profile: {
    something: String,
    somethingElse: String
  }
});
schema.index({name: 'text', 'profile.something': 'text'});

或者,如果要在索引中包括所有字符串字段,请使用'$**'通配符:

schema.index({'$**': 'text'});

这将使您能够执行分页文本搜索查询,例如:

MyModel.find({$text: {$search: searchString}})
       .skip(20)
       .limit(10)
       .exec(function(err, docs) { ... });

有关更多详细信息,请阅读完整的MongoDB Text Indexes文档。


1
感谢您的回答。这样做不会降低MongoDB的性能吗?请再问一个问题:我也可以选择要索引的字段吗?
Ayeye Brazo

4
@AyeyeBrazo我更新了分析工具,以显示如何选择要索引的字段。添加任何索引会增加插入和更新期间的开销,并增加存储需求,因此必须始终考虑这一点。
JohnnyHK

4
经过长时间的搜索,您的答案为王!
Holger D. Schauf 2015年

2
是否可以进行“ wordA AND wordB”搜索?并搜索部分单词?
Pumych '16

2
@Pumych检查docs.mongodb.com/manual/reference/operator/query/text/…用于区分大小写的搜索
Prasanth Jaya
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.