我正在清理我继承的脏数据库,需要"模糊匹配"人类评论的名称。我提出了一个有效的解决方案,但它非常慢 - 在15k行上7分钟。我有一种感觉,我忽略了一些非常简单的解决方案。
示例记录:
1 John Smith
2 John Q Smith
3 Janway Smith
4 Jane Chen
5 David Jones
6 Natalia La Brody
7 Natalia LaBrody
8 LaBrody
9 Dave Jones
我需要多个标准来进行模糊匹配。我提出的两个包括:
我的代码如下所示:
UPDATE authors a
INNER JOIN (SELECT id, author_name FROM authors) b
ON CASE WHEN a.author_name NOT REGEXP ' '
THEN
a.author_name =
substring_index(b.author_name, ' ', -1)
ELSE
concat(LEFT(a.author_name, 3), RIGHT(a.author_name, 5)) =
concat(LEFT(b.author_name, 3), RIGHT(b.author_name, 5))
END
SET tags = concat_ws(',',tags,'Duplicate?')
WHERE a.id <> b.id
我很惊讶我可以将一个CASE放在一个ON子句中,但它有效。不过,我怎样才能以更好的性能做到这一点?
答案 0 :(得分:1)
一种方法是使用soundex。您不能100%依赖它,但它可以帮助您缩小搜索结果范围并快速进行查询
select t, soundex(t) from
(
select 'John Smith' as t
union
select 'John Q Smith' as t
union
select 'Janway Smith' as t
union
select 'Jane Chen' as t
union
select 'David Jones' as t
union
select 'Natalia La Brody' as t
union
select 'Natalia LaBrody' as t
union
select 'LaBrody' as t
union
select 'dave jones' as t
)tbl
group by soundex(t)
输出
'Natalia La Brody', 'N34163'
'LaBrody', 'L163'
'John Smith', 'J5253'
'Jane Chen', 'J525'
'David Jones', 'D13252'
'dave jones', 'D1252'
答案 1 :(得分:0)
数据库(一般而言)不是为此目的而设计的。
使用的一种算法是Levenshtein distance。您可以轻松找到MySQL的实现,但这对您的问题没有帮助。
说实话,这种字符串匹配通常需要手动检查。您可以考虑将数据加载到电子表格中,按字母顺序排序,并在值相同时在电子表格中注明。
最后,你将不得不花费大量时间来弄清楚&#34;复制&#34;是的,所以你不妨计划你的工作量。