MySQL优化查询"模糊匹配"重复?

时间:2017-10-09 02:52:12

标签: mysql duplicates fuzzy-search

我正在清理我继承的脏数据库,需要"模糊匹配"人类评论的名称。我提出了一个有效的解决方案,但它非常慢 - 在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

我需要多个标准来进行模糊匹配。我提出的两个包括:

  1. 根据前三个和后五个字母的连续点检查匹配项。
  2. 如果单个单词检查所有后续单词
  3. (我可以添加更多条件)
  4. 我的代码如下所示:

    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子句中,但它有效。不过,我怎样才能以更好的性能做到这一点?

2 个答案:

答案 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;是的,所以你不妨计划你的工作量。