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

时间:2015-02-27 21:59:07

标签: javascript node.js mongodb express mongoose

我几天来一直在谷歌上搜索,但我尝试了很多东西,但我仍然无法在我的用户集上进行良好的全文搜索。

我尝试过ElasticSearch但是查询和分页几乎是不可能的......

我尝试了许多Mongoose插件,如ElMongo,mongoose-full-text,Mongoosastic等等...每个人都记录不好,我不知道如何进行良好的全文搜索。

所以,我的收藏品是一个普通的收藏品:

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

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

如果有选项可以处理每页10个项目的分页,那将是非常好的......

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

感谢。

2 个答案:

答案 0 :(得分:122)

您可以在Mongoose架构定义中添加text index,以便在find查询中使用$text运算符来搜索文本索引中包含的所有字段。

要创建支持文本搜索的索引,例如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 :(得分:-18)

对于搜索查询,您可以使用Elasticsearch插件。在Elasticsearch中,您可以创建自己的自定义搜索查询,以便实时搜索具有指定持续时间的任何特定文本和字符串。

但在此之前,您必须为驻留在MongoDB中的json文档编制索引。您必须将MongoDB与Elasticsearch服务器连接。然后使用Elasticsearch的河流功能,您必须在数据的Elasticsearch服务器中进行索引,然后才能进行自定义查询以进行搜索。