#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.
.literal()
принимать только строку. Если вы хотите использовать объектную нотацию для своего запроса, ваш прокомментированный код будет работать. За исключением того, что нет второго аргумента. Вам нужно будет объединить — или интерполировать — ваш поисковый запрос вAGAINST
предложение. Кроме того, не забывайте свои кавычки. Выходные данныеliteral()
по сути, представляют собой строку. Вашему параметру MySQL FTS потребуется заключить его в кавычки правильного типа, точно так же, как они будут отображаться в вашем необработанном SQL-запросе..query()
ПРИНИМАЕТ параметр options. Благодаря этому вам не обязательно использовать интерполяцию строк, вы можете использовать именованные замены или связанные параметры. Это позволит вам не только поместить в свойsearchword
параметр, но и любое другое предложение ORDER BY, которое вы хотите.
Я бы выбрал вариант 1. Это то, что мы делаем для нашего FTS в MS SQL.
Комментарии:
1. Спасибо astangelo! это мне очень помогло 🙂