mysql levenshtein_数据库-Levenshtein距离的MySQL /模糊搜索的实现?

数据库-Levenshtein距离的MySQL /模糊搜索的实现?

我希望能够按以下方式搜索史密斯表,以获取1个方差内的所有数据。

数据:

O'Brien

Smithe

Dolan

Smuth

Wong

Smoth

Gunther

Smiht

我已经研究过使用Levenshtein距离,有人知道如何实现它吗?

9个解决方案

11 votes

为了使用levenshtein距离进行有效搜索,您需要高效的专业索引,例如bk树。 不幸的是,我所知没有数据库系统(包括MySQL)实现bk-tree索引。 如果您要查找全文搜索,而不是每行仅搜索一个术语,则情况将更加复杂。 临时而言,我想不出以允许基于levenshtein距离进行搜索的方式进行全文索引的任何方式。

Nick Johnson answered 2020-07-27T04:18:00Z

7 votes

Levenshtein Distance函数有一个MySQL UDF实现

[HTTPS://GitHub.com/精密测角啦/leven石忒牛-MySQL-UDF]

它用C语言实现,比schnaader提到的“ MySQL Levenshtein距离查询”具有更好的性能。

Hongzheng answered 2020-07-27T04:18:28Z

5 votes

此处可以找到damerau-levenshtein距离的实现:Damerau-Levenshtein算法:具有换位的Levenshtein纯Levenshtein距离的改进在于考虑了字符交换。 我在schnaader链接的评论中找到了它,谢谢!

Ponk answered 2020-07-27T04:18:49Z

4 votes

上面的levenshtein <= 1给出的功能不正确-例如,“ bed”和“ bid”给出的结果不正确。

在第一个答案中,我修改了上面给出的“ MySQL Levenshtein距离查询”,以接受一个“限制”,它将使速度加快一点。 基本上,如果只关心Levenshtein <= 1,则将限制设置为“ 2”,该函数将返回确切的levenshtein距离(如果为0或1);否则,它将返回确切的levenshtein距离。 如果确切的levenshtein距离为2或更大,则为2。

此mod使其速度提高15%到50%-搜索单词越长,优势就越大(因为该算法可以更早地保释。)例如,对200,000个单词进行搜索以查找该单词距离1之内的所有匹配项 “咯咯地笑”,原件在我的笔记本电脑上需要3分47秒,而“极限”版本则为1:39。 当然,它们对于任何实时使用都太慢了。

码:

DELIMITER $$

CREATE FUNCTION levenshtein_limit_n( s1 VARCHAR(255), s2 VARCHAR(255), n INT)

RETURNS INT

DETERMINISTIC

BEGIN

DECLARE s1_len, s2_len, i, j, c, c_temp, cost, c_min INT;

DECLARE s1_char CHAR;

-- max strlen=255

DECLARE cv0, cv1 VARBINARY(256);

SET s1_len = CHAR_LENGTH(s1), s2_l

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值