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

jhkqcmku  于 2022-12-22  发布在  Go
关注(0)|答案(2)|浏览(124)

我在谷歌上搜索,因为天,我尝试了很多事情,但我仍然不能执行一个很好的全文搜索我的用户集合。
我试过ElasticSearch,但很难查询和分页...
我尝试了许多插件Mongoose像ElMongo,mongoose全文,Mongoosastic等...每个人都是真的很糟糕的记录,我不知道如何执行一个良好的全文搜索。
所以,我的收藏是一个普通的收藏:

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

我在一个页面中有一个简单的POST搜索输入,如果我键入hello world,我需要的是在整个集合字段中搜索与我的搜索查询匹配的单词并获得结果。
这将是真的很好,也有选项来处理分页一样,10个项目每页或什么...
实现这一点的最佳解决方案是什么?我使用MongoDB 2.6. * 和Mongoose、NodeJS和ExpressJS。
谢谢。

xdyibdwo

xdyibdwo1#

您可以向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文档。

kwvwclae

kwvwclae2#

这不是一个额外的答案,而是一个加法,但如果JohnnyHK的上述答案给你一个空数组[]。
1.先尝试一些基本的东西,不要使用limitskip
const results = await MyModel.find({ $text: { $search: "text" } });
1.请检查是否使用db.stories.getIndexes()的mongosh或随附的compass GUI正确创建了索引。否则,请通过COMPASS GUI或使用docs的mongosh创建索引

1.然后尝试多次更改searchText并尝试。
1.即使在这一切之后,我花了7- 8次运行相同的代码才得到正确的结果,

相关问题