首页 文章

使用Sequelize进行MySQL FullText搜索

提问于
浏览
7

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

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

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

谢谢 !

3 回答

  • 4

    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 . 它适用于同义词和屈折词 .

  • 6

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

    由于Sequlize不支持fullText搜索 .

    这是从表中搜索字符串的另一种方法

    models.sequelize.query(
        "SELECT * FROM tableName WHERE CONCAT(field1, '', field2, '', field3, '', field4 ) LIKE \"%" + keyword + "%\"",
        {type: models.sequelize.QueryTypes.SELECT}).then(res => {
    
    })
    

相关问题