【问题标题】:MySQL optimize query for "fuzzy matching" duplicates?MySQL优化“模糊匹配”重复查询?
【发布时间】: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

我需要多个条件来进行这种模糊匹配。我想出的两个包括:

  1. 根据前三个和后五个字母的连接来检查匹配项。
  2. 如果一个单词检查所有最后的单词
  3. (我可能会添加更多条件)

我的代码如下所示:

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


    【解决方案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'
    

    【讨论】:

    • 我不知道 soundex 是一个原生函数!优点:它超级快。缺点:我的数据有 98% 的误报。简直大错特错。它确实成功地显示了一个中间首字母的重复项,但绝大多数都是这样的:K325: KJ Dakin, Keith Gessen, Kate Zezima, Katie Kane, Kathy Gannon, Kate Zen, Kate Kenny
    【解决方案2】:

    数据库(通常)不是为此目的而设计的。

    一种被使用的算法是Levenshtein distance。您可以轻松找到 MySQL 的实现,但这对您的问题没有帮助。

    说实话,这样的字符串匹配通常需要手动检查。您可以考虑将数据加载到电子表格中,按字母顺序排列,并在电子表格中注明值何时相同。

    最后,您将不得不花费大量时间找出“重复项”在哪里,因此您不妨围绕此计划您的工作量。

    【讨论】:

    • 我的帖子指出需要手动检查。这是为了加快该过程,否则我们将手动检查 15,000 条记录,没有优先级。但感谢有关 Levenshtein 距离的提示,这可能会有所帮助。
    • Levenshtein 距离计算非常耗时,遗憾的是根本无助于回答最初的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    相关资源
    最近更新 更多