使用 mongoose 全文搜索和 KeystoneJS 分页

Posted

技术标签:

【中文标题】使用 mongoose 全文搜索和 KeystoneJS 分页【英文标题】:Using mongoose full text search with KeystoneJS paginate 【发布时间】:2018-02-14 00:32:48 【问题描述】:

我有来自 Keystone 模型的全文搜索返回结果。问题是我使用model.find() 生成这些结果。我想对这些结果进行分页,但我找不到将$text.paginate() 一起使用的方法。有没有办法将猫鼬全文搜索与 Keystone 分页相结合,甚至对来自model.find() 的结果进行分页?

编辑

我已经厌倦了使用keystone.list('List').paginate().find(),但我收到一个错误:“回调不是函数。”也许我的代码还有其他问题:

keystone.list('Document').paginate(
  page: req.query.page || 1,
  perPage: 10,
  maxPages: 6,
)
.find(
   $text :  $search : req.query.search  ,
   score :  $meta: "textScore"  
)
.sort( score :  $meta : 'textScore'  )
.exec(function(err, results) 
  locals.documents = results;
  next();
);

【问题讨论】:

你试过model.paginate().find()吗? 我尝试了 model.paginate().find(),但由于 paginate() 不是 model 的函数,所以会报错。我也尝试过 paginate().model.find(),它的作用与我简单地调用 model.find() 相同。 试试这个:keystone.list('MyList').paginate().find() - 'MyList' 是你的列表的名称。 我有。我编辑了原始帖子,并在执行此操作时收到错误 + 我的代码。 你在哪里使用回调 【参考方案1】:

这就是我设法进行过滤的方式。 Keystone boilerplate。下面是我的待办事项模型

import keystone from 'keystone';

const  Field:  Types   = keystone;

const Todo = new keystone.List('Todo');

Todo.add(
   title: 
   type: String, required: true, default: Date.now,
 ,
 description:  type: Types.html, wysiwyg: true ,
 createdAt:  type: Date, default: Date.now ,
);

Todo.relationship( path: 'users', ref: 'User', refPath: 'todos' );
Todo.schema.index( title: 'text' );
Todo.register();

export default Todo;

和分页过滤器

export const list = (req, res) => 
const search = new RegExp(req.query.search || '', 'i');
const query = 
  title: search,
;
Todo.paginate(
   page: req.query.page || 1,
   perPage: 5,
   maxPages: 10,
   filters: 
     $or: [query],
   ,
 ).sort('-createdAt').exec((err, items) => 
 if (err) return res.status(500).json(err);

   return res.json(
     data: items,
   );
 );
;

【讨论】:

【参考方案2】:

您可以使用这样的过滤器:

keystone.list('Document').paginate(
    page: req.query.page || 1,
    perPage: 10,
    maxPages: 6,
    filters: 
        $text: 
            $search: req.query.search || ''
        ,
    ,
    optionalExpression: 
        score: $meta: "textScore"
    ,
)
.sort( score :  $meta : 'textScore'  )
.exec(function(err, results) 
    locals.documents = results;
    next();
);

paginate 函数会将其传递给find 函数。 See here.

【讨论】:

以上是关于使用 mongoose 全文搜索和 KeystoneJS 分页的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mongoose 在 Node JS 中进行全文搜索

猫鼬,nodejs,全文搜索

猫鼬全文搜索不起作用

MongoDB 全文和部分文本搜索

在猫鼬中使用权重进行全文搜索

全文搜索之MySQL与ElasticSearch搜索引擎