【问题标题】:Best way to perform a full text search in MongoDB and Mongoose在 MongoDB 和 Mongoose 中执行全文搜索的最佳方法
【发布时间】:2015-04-30 18:06:08
【问题描述】:

我从几天以来一直在 Google 上搜索,我尝试了很多方法,但我仍然无法对我的用户集合执行良好的全文搜索。

我尝试了 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 一起使用。

谢谢。

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    您可以将text index 添加到您的 Mongoose 架构定义中,以便您在 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 文档。

    【讨论】:

    • 感谢您的回答。这样做不会降低 MongoDB 的性能吗?请再问一个问题:我也可以选择要索引的字段吗?
    • @AyeyeBrazo 我更新了分析器以显示如何选择要索引的字段。添加任何索引都会在插入和更新期间增加开销,并增加存储要求,因此必须始终考虑这一点。
    • 经过长时间的搜索,你的答案就是王道!
    • 是否有可能进行“wordA AND wordB”搜索?并搜索部分单词?
    • @Pumych 检查docs.mongodb.com/manual/reference/operator/query/text/… 是否区分大小写搜索
    猜你喜欢
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    相关资源
    最近更新 更多