我正在尝试改进我的网站上的搜索,这是它目前的样子(我使用NodeJS,Sequelize和PostgreSQL):
db.food.findAll({
where: {
nameFood: {
$iLike: '%' + queryName + '%'
}
}
}).then(function (foods) {
foods.sort(compareFood);
res.json(foods);
}, function (e) {
res.status(500).send();
});
我认为这是非常自我解释的,但如果事情不明确,请在评论中问我。
现在,这个搜索算法考虑了WHOLE参数,因此搜索“鸡蛋”将不返回任何内容,因为在我的数据库中它们被保存为“鸡蛋”。
我对快速改进的想法是拆分查询查找空格然后查询每个关键字,如:
var keywords = queryName.split(' ');
由于我有关键字,现在如何查询变量次数并将结果连接到数组中以像食物中的那样返回?
我在这里检查了文档和一些问题,但找不到任何内容,感谢任何帮助,非常感谢。
答案 0 :(得分:3)
您可以使用$or
属性查询匹配" eggs"或"鸡"。
以下是一个例子:
// split queryName by spaces
var qry = queryName.split(' ');
// convert each item into a $iLike object
// ['chicken', 'eggs'] -> [{ $iLike: '%chicken%' }, { $iLike: '%eggs%' }]
qry = qry.map(function(item) {
return {
$iLike: '%' + item + '%';
};
});
db.food.findAll({
where: {
nameFood: { $or: qry }
}
}).then(function (foods) {
foods.sort(compareFood);
res.json(foods);
}).catch(function (e) {
res.status(500).send();
});
希望能回答你的问题,但在你去之前我也有一个很好的建议,你可能会觉得有帮助。
其中一个使用.catch
函数接收任何错误。而不是对结果和错误使用.then
,您可以.then
处理结果,.catch
处理错误。
db.food.findAll()
.then(function(results) {
})
.catch(function(err) {
});
而不是
db.food.findAll()
.then(function(results) {
}, function(err) {
});