D D*_*ane 7 mysql full-text-search sequelize.js
我想用sequelize实现MySQL全文搜索.版本"sequelize":"^ 3.23.6".我试图研究这个,但找不到=指导如何实现这个的文档.以下是sequelize支持FullText的链接:https: //github.com/sequelize/sequelize/issues/2979
但是没有关于如何做到这一点以及如何使用sequelize进行全文搜索查询的确切文档.
任何链接建议都会有所帮助
谢谢 !
Sequelize并不完全支持全文搜索功能.我们可以像任何其他索引一样简单地添加FULLTEXT索引.但是支持MATCH (column) AGAINST (value)语法的运算符尚未实现.
我目前解决问题的方法是创建一个常规模型:
module.exports = (sequelize, DataTypes) => {
const Book = sequelize.define('Book', {
title: DataTypes.STRING,
description: DataTypes.TEXT,
isActive: DataTypes.BOOLEAN
}, {
indexes: [
// add a FULLTEXT index
{ type: 'FULLTEXT', name: 'text_idx', fields: ['description'] }
]
});
return Book;
};
Run Code Online (Sandbox Code Playgroud)
并使用原始查询进行查询:
const against = 'more or less';
models.Book.find({
where: ['isActive = 1 AND MATCH (description) AGAINST(?)', [against]]
}).then((result) => {
console.log(result.title);
});
Run Code Online (Sandbox Code Playgroud)
如果你试图搜索屈折词,同义词等,那么只使用MySQL就不可能获得正确的结果.MySQL开发人员考虑为全文搜索添加词典(https://dev.mysql.com/worklog/task/?id= 2428),但是谁知道什么时候会看到它.
如果你必须坚持使用MySQL,我建议你看看Sphinx.它适用于同义词和屈折词.
由于我们现在在最近的Sequelize中有如下错误消息:
Unhandled rejection Error: Support for literal replacements in the where object has been removed.
解决方案是手动提供替代品
Payments.findAll({
where: Sequelize.literal('MATCH (SomeField) AGAINST (:name)'),
replacements: {
name: 'Alex'
}
});
Run Code Online (Sandbox Code Playgroud)
使用数组处理更复杂的情况:
Payments.findAll({
where: [
{ State: 'Paid' },
Sequelize.literal('MATCH (SomeField) AGAINST (:name)')
],
replacements: {
name: 'Alex'
}
});
Run Code Online (Sandbox Code Playgroud)