продолжить полнотекстовый запрос с использованием параметров

#mysql #node.js #express #sequelize.js #full-text-search

#mysql #node.js #выразить #sequelize.js #полнотекстовый поиск

Вопрос:

Привет, в настоящее время я пытаюсь запросить записи из базы данных, и это условия

  • Я получаю ‘order by’, ‘order (desc / asc)’, ‘limit’, ‘offset’ из интерфейса
  • Мне также нужно выполнить поиск записи с помощью match…против. ‘like’ слишком медленный для поиска.
  • С этим запросом есть сопоставленная модель.

итак, я попытался

     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 ] }
    //  )
    });
  

но прокомментированная часть кажется неправильной в этом коде.
Я попробовал исходный запрос, но тогда я не могу параметризовать эти переменные order by, order, offset, limit.
Я не хочу просто добавлять их как $ {orderby}, потому что это рискованно.

Пожалуйста, дайте мне знать, если у вас есть какое-либо решение для этой проблемы.

Заранее благодарю вас!

Ответ №1:

Вы путаете Sequelize.literal() и sequelizeInstance.query() API.

  1. .literal() принимать только строку. Если вы хотите использовать объектную нотацию для своего запроса, ваш прокомментированный код будет работать. За исключением того, что нет второго аргумента. Вам нужно будет объединить — или интерполировать — ваш поисковый запрос в AGAINST предложение. Кроме того, не забывайте свои кавычки. Выходные данные literal() по сути, представляют собой строку. Вашему параметру MySQL FTS потребуется заключить его в кавычки правильного типа, точно так же, как они будут отображаться в вашем необработанном SQL-запросе.
  2. .query() ПРИНИМАЕТ параметр options. Благодаря этому вам не обязательно использовать интерполяцию строк, вы можете использовать именованные замены или связанные параметры. Это позволит вам не только поместить в свой searchword параметр, но и любое другое предложение ORDER BY, которое вы хотите.

Я бы выбрал вариант 1. Это то, что мы делаем для нашего FTS в MS SQL.

Комментарии:

1. Спасибо astangelo! это мне очень помогло 🙂