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

问题描述 投票:0回答:3

我几天来一直在 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 一起使用。

谢谢。

javascript node.js mongodb express mongoose
3个回答
293
投票

您可以将 文本索引 添加到 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 文本索引 文档。


4
投票

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

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

    limit
    skip

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

  2. 请检查索引是否使用 mongosh 正确创建

    db.stories.getIndexes()
    或指南针 GUI 均已附接。或者通过 COMPASS GUI 或通过 mongosh 使用 docs

    创建一个

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

0
投票

let results = await User.find( {$text: {$search: "text that you want to search for"}}, {score: {$meta: "textScore"}}) .sort({score:{$meta:"textScore"}});
其中 User 是您创建的架构,并且应将其编码的函数设为异步。

© www.soinside.com 2019 - 2024. All rights reserved.