【发布时间】:2017-10-09 02:52:12
【问题描述】:
我正在清理我继承的脏数据库,需要“模糊匹配”名称以供人工审核。我想出了一个可行的解决方案,但速度非常慢——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 子句中,但它确实有效。不过,我怎样才能以更好的性能做到这一点?
【问题讨论】:
标签: mysql duplicates fuzzy-search