使用Sequelize进行MySQL FullText搜索

时间:2016-08-24 12:40:43

标签: mysql full-text-search sequelize.js

我想用sequelize实现MySQL全文搜索。版本" sequelize":" ^ 3.23.6"。我试图研究这个,但找不到=指导如何实现这个的文档。 以下是sequelize支持FullText的链接: https://github.com/sequelize/sequelize/issues/2979

但是没有关于如何做到这一点以及如何使用sequelize进行全文搜索查询的确切文档。

任何链接建议都会有所帮助

谢谢!

3 个答案:

答案 0 :(得分:6)

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;
};

使用原始查询进行查询:

const against = 'more or less';

models.Book.find({
  where: ['isActive = 1 AND MATCH (description) AGAINST(?)', [against]]
}).then((result) => {
  console.log(result.title);
});

只使用MySQL,如果你试图搜索屈折词,同义词等,就不可能得到正确的结果.MySQL开发人员考虑为全文搜索添加词典(https://dev.mysql.com/worklog/task/?id=2428),但谁知道我们何时会看到它

如果您必须坚持使用MySQL,我建议您查看Sphinx。它适用于同义词和屈折词。

答案 1 :(得分:4)

因为我们现在在最近的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'
  }
});

将数组用于更复杂的条件:

Payments.findAll({
  where: [
    { State: 'Paid' },
    Sequelize.literal('MATCH (SomeField) AGAINST (:name)')
  ],
  replacements: {
    name: 'Alex'
  }
});

答案 2 :(得分:1)

由于Sequlize不支持fullText搜索。

这是从表

中搜索字符串的另一种方法
models.sequelize.query(
    "SELECT * FROM tableName WHERE CONCAT(field1, '', field2, '', field3, '', field4 ) LIKE \"%" + keyword + "%\"",
    {type: models.sequelize.QueryTypes.SELECT}).then(res => {

})