MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLのSOUNDEX()関数を使って発音が似た文字列を検索する方法

SOUNDEX()関数とは

MySQLのSOUNDEX()関数は、文字列からサウンドex(Soundex)コードと呼ばれる音声表現の文字列を返します。Soundexは、英語の発音の類似性に基づいて文字列をインデックス化するアルゴリズムで、発音がほぼ同じ2つの文字列は、同一のSoundexコードを持つという特徴があります。

この特性を活かすことで、スペルは異なるが発音が似ている名前や単語を効率的に検索できます。

SOUNDEX()を使用したクエリの基本構文

MySQLでSOUNDEX()を使って検索するには、以下のような構文を使用します。

SELECT * FROM テーブル名 WHERE SOUNDEX(検索したい値) = SOUNDEX(カラム名);

実際に試してみよう:テーブルの作成

まず、動作確認用のテーブルを作成します。

mysql> create table DemoTable
    (
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    FirstName varchar(20),
    LastName varchar(20)
    );
Query OK, 0 rows affected (0.28 sec)

次に、INSERTコマンドでレコードを挿入します。

mysql> insert into DemoTable(FirstName,LastName) values('Adam','Smith');
Query OK, 1 row affected (0.04 sec)

mysql> insert into DemoTable(FirstName,LastName) values('David','Miller');
Query OK, 1 row affected (0.07 sec)

mysql> insert into DemoTable(FirstName,LastName) values('Carol','Taylor');
Query OK, 1 row affected (0.06 sec)

mysql> insert into DemoTable(FirstName,LastName) values('Chris','Brown');
Query OK, 1 row affected (0.06 sec)

mysql> insert into DemoTable(FirstName,LastName) values('John','Smith');
Query OK, 1 row affected (0.07 sec)

登録データの確認

SELECT文ですべてのレコードを表示して、データが正しく登録されているか確認しましょう。

mysql> select *from DemoTable;

実行結果は以下の通りです。

+----+-----------+----------+
| Id | FirstName | LastName |
+----+-----------+----------+
| 1  | Adam      | Smith    |
| 2  | David     | Miller   |
| 3  | Carol     | Taylor   |
| 4  | Chris     | Brown    |
| 5  | John      | Smith    |
+----+-----------+----------+
5 rows in set (0.00 sec)

SOUNDEX()を使った実際の検索クエリ

それでは、「Smith」という発音に一致するレコードをSOUNDEX()関数で検索してみます。

mysql> select *from DemoTable where soundex('Smith')=soundex(LastName);

このクエリでは、検索値「Smith」のSoundexコードと、LastNameカラムの各値のSoundexコードを比較し、一致する行のみを抽出します。

実行結果は以下の通りです。

+----+-----------+----------+
| Id | FirstName | LastName |
+----+-----------+----------+
| 1  | Adam      | Smith    |
| 5  | John      | Smith    |
+----+-----------+----------+
2 rows in set (0.00 sec)

結果の解説と活用ポイント

上記の例では、姓が「Smith」であるAdam SmithとJohn Smithの2件が正しく取得できました。仮に「Smyth」や「Smithe」など、スペルが異なっても発音が似た名前が登録されていれば、それらも同じようにヒットします。

SOUNDEX()の主な活用シーン

  • 顧客名・氏名のあいまい検索: 入力ミスや表記ゆれのある名前でも検索可能になります。
  • 重複データの検出: 発音が似た同名データを見つけ出すのに役立ちます。
  • 電話帳・アドレス帳アプリ: 音声入力との組み合わせで誤変換された名前の補完にも利用できます。

注意点

  • SOUNDEX()は英語圏の発音ルールに基づいているため、日本語などのマルチバイト文字に対しては期待通りの結果が得られない場合があります。
  • SOUNDEX()をWHERE句で使用すると、カラムのインデックスが利用されずフルスキャンになる可能性があるため、大規模なテーブルでの使用には注意が必要です。
  1. MySQLで文字列をBIGINT型にキャストする方法|CONV()関数とCAST演算子の使い方

    MySQLでは、CAST演算子とCONV()関数を組み合わせることで、文字列をBIGINT型(符号なし整数)に変換できます。CONV()関数は、ある基数の数値を別の基数の数値へ変換するための関数です。例えば、基数「16」は16進数(ヘキサデシマル)、基数「10」は10進数(デシマル)を表します。つまり、16進数の文字列を10進数の整数値に変換できるのです。基本構文構文は以下の通りです。SELECT CAST(CONV(yourColumnName,16,10) AS UNSIGNED INTEGER) as anyAliasName FROM yourTableName;実際にテーブルを作成し

  2. MySQLでサブクエリを正しく括弧で囲む方法

    MySQLでは、サブクエリを使用する際に必ず丸括弧( )で囲む必要があります。括弧で囲まれていないサブクエリは構文エラーになるため、注意が必要です。基本構文サブクエリを正しく囲むための基本的な構文は以下の通りです。select if((select count(*) from テーブル名), Yes, No) as 別名;この構文では、IF関数の中にサブクエリを配置しています。サブクエリの結果(レコード数)が0より大きければ「Yes」を、0であれば「No」を返します。動作確認用テーブルの作成実際に動きを理解するために、まずサンプルテーブルを作成しましょう。テーブル作成クエリは以下の通りです。m