You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node-Sequelize特殊字符搜索:输入jose匹配带重音姓名

解决带重音字符的模糊匹配问题

方法1:利用数据库去重音函数(推荐)

不同数据库自带去重音处理能力,查询时将存储的姓名与输入关键词统一转换为无重音形式再匹配,精准度和性能都更优。

MySQL/MariaDB

  • 若使用MySQL 8.0+,可先安装unaccent插件,再通过函数处理:
return await User.findAll({
  where: sequelize.where(
    sequelize.fn('unaccent', sequelize.col('name')),
    { [Op.like]: '%jose%' }
  )
});
  • 无插件时,用正则替换覆盖常见重音字符:
return await User.findAll({
  where: sequelize.where(
    sequelize.fn('REGEXP_REPLACE', sequelize.col('name'), '[áàâãäóòôõöéèêë]', match => {
      const map = {á:'a', à:'a', â:'a', ã:'a', ä:'a', ó:'o', ò:'o', ô:'o', õ:'o', ö:'o', é:'e', è:'e', ê:'e', ë:'e'};
      return map[match] || match;
    }),
    { [Op.like]: '%jose%' }
  )
});

PostgreSQL

先启用自带的unaccent扩展(仅需执行一次):

CREATE EXTENSION IF NOT EXISTS unaccent;

再在Sequelize中调用函数查询:

return await User.findAll({
  where: sequelize.where(
    sequelize.fn('unaccent', sequelize.col('name')),
    { [Op.iLike]: '%jose%' } -- iLike同时忽略大小写
  )
});

方法2:修改字段排序规则

如果数据库支持,将姓名字段的排序规则改为不区分重音的类型,后续直接用普通like即可匹配:

  • MySQL:设置字段字符集为utf8mb4,排序规则选utf8mb4_general_ci(该规则不区分重音)
  • PostgreSQL:设置字段排序规则为unaccent类型

修改完成后,原查询代码即可生效:

return await User.findAll({ where: { name: { [Op.like]: '%jose%' } } });

方法3:预处理关键词生成正则

将输入关键词转换为包含所有重音变体的正则表达式,再执行正则匹配:

// 转义正则特殊字符
function escapeRegExp(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

// 替换字符为包含重音的正则组
function addAccentVariants(keyword) {
  const variantMap = {
    'a': '[aáàâãä]',
    'e': '[eéèêë]',
    'o': '[oóòôõö]'
  };
  return escapeRegExp(keyword).replace(/[aeo]/gi, match => variantMap[match.toLowerCase()]);
}

const regex = new RegExp(addAccentVariants('jose'), 'i');
return await User.findAll({
  where: { name: { [Op.regexp]: regex } }
});

注意:该方法适合关键词较短的场景,长关键词会导致正则过于复杂,影响查询性能。


内容的提问来源于stack exchange,提问作者William C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 13:10:34