2017-10-09 9 views
0

私は継承した汚れたデータベースを整理しており、人間の見直しのために名前を「曖昧にする」必要があります。私は動作する解決策を思いついたが、それはひどく遅い - 15k行で7分。私は本当にシンプルな解決策を見落としていると感じています。MySQLは "ファジーマッチング"重複のクエリを最適化しますか?

例レコード:

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. 最初の3文字と最後の5文字の連結を基準にして一致を調べます。
  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 

私はケースを置くことが驚きましたON句が機能しましたそれでも、パフォーマンスを大幅に向上させるにはどうすればよいでしょうか?

答えて

0

データベースは(一般的に)この目的のために設計されていません。

使用されるアルゴリズムの1つはLevenshtein distanceです。 MySQLの実装を簡単に見つけることはできますが、それはあなたの問題を解決するものではありません。

正直言って、このような文字列のマッチングには、手動によるチェックが必要なことがよくあります。スプレッドシートにデータをロードし、アルファベット順に並べ替えて、値が同じ場合にスプレッドシートに書き留めておくだけです。

最終的には、「重複」がどこにあるかを把握するために多くの時間を費やさなければならないため、その周りの作業負荷を計画することもできます。

+0

私のポストを作成手動チェックの必要性を指摘しています。これは、そのプロセスをスピードアップするためのものです。それ以外の場合は、優先順位付けを行わずに15,000レコードを手動でチェックしています。しかし、Levenshtein距離に関するヒントをお寄せいただきありがとうございます。 – Slam

+0

Levenshtein距離の計算には多大な時間がかかり、悲しいことに元の質問にはまったく役立たない。 – Slam

1

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' 
+0

私はsoundexがネイティブ関数であることを知らなかった!長所:それは超高速です。短所:私のデータには98%の誤検知があります。それはひどく間違っているだけです。 K32 Dakin、Keith Gessen、Kate Zezima、Kateie Kane、Kathy Gannon、Kate Zen、Kate Kennyのような大半がこのようなものです。 – Slam