개요
사용자가 검색창에 'demo'를 입력하려다 실수로 'deom'처럼 철자를 잘못 입력하는 경우는 흔히 발생합니다. 이런 오타가 포함된 데이터를 검색하려면 MySQL의 SOUNDS LIKE 연산자를 LIKE와 함께 사용하면 됩니다. SOUNDS LIKE는 두 문자열이 발음상 유사한지를 비교하는 기능으로, 영어 단어의 철자 오류를 보정해 주는 데 매우 유용합니다.
예제 테이블 생성하기
먼저 예제로 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Name varchar(20)
-> );
Query OK, 0 rows affected (0.95 sec)
데이터 삽입하기
INSERT 명령을 사용해 몇 개의 레코드를 추가합니다. 여기서는 의도적으로 'Johm'(John의 오타)과 'SAMSUMG'(SAMSUNG의 오타)도 함께 넣었습니다.
mysql> insert into DemoTable values('John');
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable values('Adam');
Query OK, 1 row affected (0.33 sec)
mysql> insert into DemoTable values('Johm');
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable values('Carol');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('SAMSUNG');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('SAMSUMG');
Query OK, 1 row affected (0.13 sec)전체 레코드 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+---------+
| Name |
+---------+
| John |
| Adam |
| Johm |
| Carol |
| SAMSUNG |
| SAMSUMG |
+---------+
6 rows in set (0.00 sec)
SOUNDS LIKE로 오타 검색하기
테이블에 오타로 저장된 문자열을 검색하는 쿼리입니다. 예를 들어 'demo' 대신 'deom'이 입력된 경우, 'samsung' 대신 'samsumg'가 입력된 경우 모두 발음 기준으로 매칭됩니다.
mysql> select *from DemoTable where Name SOUNDS LIKE 'samsung';
실행 결과는 다음과 같습니다.
+---------+
| Name |
+---------+
| SAMSUNG |
| SAMSUMG |
+---------+
2 rows in set (0.00 sec)
동작 원리와 참고 사항
SOUNDS LIKE는 내부적으로 SOUNDEX() 함수를 사용합니다. SOUNDEX는 문자열을 발음 기반의 코드(예: 'SAMSUNG'과 'SAMSUMG'가 동일한 코드로 변환)로 변환하여 비교하기 때문에, 철자가 조금 달라도 소리가 비슷하면 함께 검색됩니다.
다만 몇 가지 유의할 점이 있습니다.
- SOUNDEX는 영어 발음을 기준으로 설계되었으므로 한글 등 비영어권 언어에는 적합하지 않습니다.
- 발음이 비슷하지만 전혀 다른 단어까지 함께 조회될 수 있어, 정확도가 중요한 서비스라면 FULLTEXT 검색이나 별도의 유사도 알고리즘(Levenshtein 거리 등)을 고려하는 것이 좋습니다.
- SOUNDS LIKE를 사용하면 인덱스를 활용하기 어렵기 때문에 대용량 테이블에서는 성능 저하가 발생할 수 있습니다.
이처럼 간단한 쿼리 하나로 오타가 포함된 데이터도 손쉽게 검색할 수 있으니, 사용자 입력 오류를 어느 정도 허용해야 하는 검색 기능에 활용해 보시기 바랍니다.