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

Best way to perform a full text search in MongoDB and Mongoose

几天以来我一直在 Google 上搜索,我尝试了很多方法,但我仍然无法对我的用户 collection.

执行良好的全文搜索

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

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

所以,我的 collection 是正常的 collection:

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

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

如果能有处理分页的选项,比如每页 10 个项目或其他东西,那将是非常好的...

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

谢谢。

您可以在 find 查询中添加 text index to your Mongoose schema definition that lets you use the $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 文档。

这不是一个额外的答案,而是一个加法,但是如果 JohnnyHK 的上述答案给你一个空数组 [] .

  1. 在没有 limitskip

    的情况下先尝试一些基本的东西

    const results = await MyModel.find({ $text: { $search: "text" } });

  2. 请检查索引是否使用 mongosh 正确创建 db.stories.getIndexes() 或罗盘 GUI 均已附加。否则通过 COMPASS GUI 或通过 mongosh 使用 docs

    创建一个

  1. 然后尝试多次更改searchText并尝试。
  2. 即便如此,我还是运行了 7-8 次相同的代码才得到正确的结果,