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

如何在Sequelize ORM中使用Levenshtein函数实现PostgreSQL数据库的相似搜索?

如何在Sequelize ORM中使用Levenshtein函数实现PostgreSQL数据库的相似搜索?

没问题!我来帮你搞定在Sequelize里结合PostgreSQL的Levenshtein距离做相似搜索的需求~

先简单理清楚Levenshtein距离是什么:它是衡量两个字符串相似度的核心指标,定义为把字符串A转换成字符串B所需的最少编辑操作次数(操作包括插入、删除或替换单个字符)。距离数值越小,代表两个字符串的相似度越高。

要实现这个功能,咱们分两步来操作:

1. 先在PostgreSQL中启用fuzzystrmatch扩展

PostgreSQL的Levenshtein函数并不在默认内置函数集合里,它属于fuzzystrmatch扩展包,所以得先开启这个扩展。你可以直接在数据库客户端执行这条SQL:

CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;

如果想在项目代码里完成这一步,也可以用Sequelize的原生查询来执行(适合放在项目初始化脚本中):

await sequelize.query('CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;');

2. 在Sequelize中调用Levenshtein函数进行搜索

接下来就可以在你的Sequelize查询里直接调用这个函数了,这里给你两种常见的使用场景:

场景一:筛选出相似度高的记录(距离小于指定值)

比如你有一个User模型,要搜索name字段和输入字符串"John"的Levenshtein距离小于3的用户,同时返回每个用户的匹配距离:

const searchString = "John";
const similarUsers = await User.findAll({
  attributes: [
    'id',
    'name',
    // 计算并返回Levenshtein距离
    [sequelize.fn('levenshtein', sequelize.col('name'), searchString), 'distance']
  ],
  // 筛选出距离小于3的记录
  where: sequelize.where(
    sequelize.fn('levenshtein', sequelize.col('name'), searchString),
    '<',
    3
  ),
  // 按相似度从高到低排序(距离越小越靠前)
  order: [[sequelize.literal('distance'), 'ASC']]
});

场景二:使用原生SQL查询(适合复杂场景)

如果你的查询逻辑比较复杂,也可以直接写原生SQL来实现:

const searchString = "John";
const similarUsers = await sequelize.query(
  `SELECT id, name, levenshtein(name, :searchString) AS distance
   FROM users
   WHERE levenshtein(name, :searchString) < 3
   ORDER BY distance ASC`,
  {
    replacements: { searchString },
    type: sequelize.QueryTypes.SELECT
  }
);

小提示

  • 如果你需要对大量数据进行相似搜索,Levenshtein的计算可能会比较耗时,建议对需要搜索的字段建立合适的索引,或者先通过部分匹配缩小范围,再计算Levenshtein距离来优化性能。
  • 除了Levenshtein,fuzzystrmatch扩展还提供了soundex、difference等其他字符串相似度函数,你可以根据具体需求选择使用。

备注:内容来源于stack exchange,提问作者Chandra Shekhar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 08:27:47