我几天来一直在 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 一起使用。
谢谢。
您可以将 文本索引 添加到 Mongoose 模式定义中,以便您在 $text
查询中使用
find
运算符来搜索文本索引中包含的所有字段。
要创建一个索引来支持文本搜索,例如
name
和 profile.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 文本索引 文档。
这不是一个额外的答案,而是一个 addUp,但是如果 JohnnyHK 的上述答案给你一个空数组 [] 。
首先尝试一些基本的东西,没有
limit
和 skip
const results = await MyModel.find({ $text: { $search: "text" } });
请检查索引是否使用 mongosh 正确创建
db.stories.getIndexes()
或指南针 GUI 均已附接。或者通过 COMPASS GUI 或通过 mongosh 使用 docs 创建一个
searchText
并尝试。let results = await User.find( {$text: {$search: "text that you want to search for"}}, {score: {$meta: "textScore"}}) .sort({score:{$meta:"textScore"}});
其中 User 是您创建的架构,并且应将其编码的函数设为异步。