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

2022-08-30 05:41:19

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

我尝试了ElasticSearch,但非常不可能查询和分页...

我尝试了许多猫鼬插件,如ElMongo,猫鼬全文,猫鼬等...每个人都记录得很糟糕,我不知道如何执行良好的全文搜索。

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

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

我在一个简单的页面中输入了一个搜索,如果我输入我需要的是在整个集合字段上搜索我的搜索查询的匹配词并获得结果。POSThello world

如果可以选择处理分页,例如每页10个项目或其他东西,那也将是非常好的......

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

谢谢。


答案 1

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

要创建索引以支持文本搜索,例如: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 文本索引文档。


答案 2

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

  1. 先尝试一些基本的东西,没有和limitskip

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

  2. 请检查索引是否使用mongosh正确创建,使用或指南针GUI两者都附加。否则,通过COMPASS GUI或使用文档通过mongosh创建一个db.stories.getIndexes()

compasss

  1. 然后尝试多次更改并尝试。searchText
  2. 即使经过所有这些,我也花了7-8次相同的代码运行才能获得正确的结果,