在 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
运算符以搜索文本索引中包含的所有字段。
要创建索引以支持文本搜索,例如 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 Text Indexes 文档。
这不是一个额外的答案,而是一个加法,但是如果 JohnnyHK 的上述答案给你一个空数组 [] .
在没有 limit
和 skip
的情况下先尝试一些基本的东西
const results = await MyModel.find({ $text: { $search: "text" } });
请检查索引是否使用 mongosh 正确创建
db.stories.getIndexes()
或罗盘 GUI 均已附加。否则通过 COMPASS GUI 或通过 mongosh 使用 docs
创建一个
- 然后尝试多次更改
searchText
并尝试。
- 即便如此,我还是运行了 7-8 次相同的代码才得到正确的结果,
几天以来我一直在 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
运算符以搜索文本索引中包含的所有字段。
要创建索引以支持文本搜索,例如 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 Text Indexes 文档。
这不是一个额外的答案,而是一个加法,但是如果 JohnnyHK 的上述答案给你一个空数组 [] .
在没有
的情况下先尝试一些基本的东西limit
和skip
const results = await MyModel.find({ $text: { $search: "text" } });
请检查索引是否使用 mongosh 正确创建
创建一个db.stories.getIndexes()
或罗盘 GUI 均已附加。否则通过 COMPASS GUI 或通过 mongosh 使用 docs
- 然后尝试多次更改
searchText
并尝试。 - 即便如此,我还是运行了 7-8 次相同的代码才得到正确的结果,