私は継承した汚れたデータベースを整理しており、人間の見直しのために名前を「曖昧にする」必要があります。私は動作する解決策を思いついたが、それはひどく遅い - 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
私はこのあいまい一致のために複数の条件を必要とします。私が思いついたのは、次のとおりです。
- 最初の3文字と最後の5文字の連結を基準にして一致を調べます。
- すべての最後の言葉
- に対する単一ワードチェックもし私のコードは次のようになります(私はより多くの条件を追加する場合があります)
:
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句が機能しましたそれでも、パフォーマンスを大幅に向上させるにはどうすればよいでしょうか?
私のポストを作成手動チェックの必要性を指摘しています。これは、そのプロセスをスピードアップするためのものです。それ以外の場合は、優先順位付けを行わずに15,000レコードを手動でチェックしています。しかし、Levenshtein距離に関するヒントをお寄せいただきありがとうございます。 – Slam
Levenshtein距離の計算には多大な時間がかかり、悲しいことに元の質問にはまったく役立たない。 – Slam