使用参数对全文查询进行排序

问题描述

嗨,我目前正在尝试从db查询记录,这些是条件

  • 我从前端收到“ order by”,“ order(desc / asc)”,“ limit”和“ offset”
  • 我还需要使用match ... against搜索记录。 “赞”搜索太慢。
  • 查询一个映射的模型。

所以我尝试了

    let order_by = req.query.orderby;
    let order = req.query.order;
    let page = req.query.pagenum;
    let perpage = req.query.parpage;
    let searchword = req.query.foodsearch;
    let offset = (parseInt(page) - 1) * parpage;

    let foods = await models.food.findAll({
        limit: parseInt(perpage),offset: offset,order: [
            [order_by,order]
        ],//  where: Sequelize.literal
    //  (
    //      `MATCH 
    //      (Name,Place,RestoNum,Ingredient,ChefName,Region...) 
    //      AGAINST
    //      ( ? IN NATURAL LANGUAGE MODE)`,//      { replacements: [ searchword ] }
    //  )
    });

,但是注释的部分在此代码中似乎是错误的。 我尝试了原始查询,但是随后无法按顺序,偏移量,限制变量对这些顺序进行参数化。 我不想像$ {orderby}那样添加它们,因为这样做很冒险。

如果您对此问题有任何解决方案,请告诉我。

提前谢谢!

解决方法

您混淆了Sequelize.literal()sequelizeInstance.query() API。

  1. .literal() only take a string。如果要对查询使用对象表示法,则注释的代码将起作用。除了没有第二个论点。您需要将搜索词连接或插入到AGAINST子句中。 Also,don't forget your quotesliteral()的输出本质上是一个字符串。您的MySQL FTS参数将需要使用正确的引号类型,就像它们会出现在原始SQL查询中一样。
  2. .query() DOES take an options parameter.通过此操作,您不必使用字符串插值you can use named replacements or bound-parameters。这样不仅可以将您放置在searchword参数中,而且可以放置所需的任何ORDER BY子句。

我会选择选项1。这就是我们在MS SQL中为FTS做的事情。