Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tìm kiếm sai chính tả (typo) với SOUNDS LIKE trong MySQL

Giới thiệu

Hàm SOUNDEX() và toán tử SOUNDS LIKE cho phép tìm kiếm dựa trên phát âm (phonetic matching), hữu ích cho sửa lỗi gõ sai tên thương hiệu, tên riêng.

1. Tạo bảng và dữ liệu

mysql> create table DemoTable (
    -> Name varchar(20)
    -> ); 
Query OK, 0 rows affected (0.95 sec)

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)

2. Dữ liệu gốc

mysql> select *from DemoTable;
+---------+
| Name    |
+---------+
| John    |
| Adam    |
| Johm    |
| Carol   |
| SAMSUNG |
| SAMSUMG |
+---------+
6 rows in set (0.00 sec)

3. Tìm "samsung" (khớp cả "SAMSUMG" - typo)

mysql> select *from DemoTable where Name SOUNDS LIKE 'samsung';

4. Kết quả

+---------+
| Name    |
+---------+
| SAMSUNG |
| SAMSUMG |
+---------+
2 rows in set (0.00 sec)

Cơ chế:

  • SOUNDEX(str) trả về mã 4 ký tự đại diện cho phát âm tiếng Anh
  • expr1 SOUNDS LIKE expr2 tương đương SOUNDEX(expr1) = SOUNDEX(expr2)
  • Dựa trên thuật toán Soundex (tiêu chuẩn Mỹ), chỉ hoạt động tốt cho tiếng Anh

Ví dụ SOUNDEX:

SELECT SOUNDEX('SAMSUNG'), SOUNDEX('SAMSUMG'), SOUNDEX('John'), SOUNDEX('Johm');
-- Kết quả: S525, S525, J500, J500

Hạn chế:

  • Chỉ dành cho tiếng Anh
  • Không dùng index → full scan
  • Không phân biệt được nhiều từ giống phát âm (homophones)

Thay thế hiện đại: Sử dụng extension pg_trgm (PostgreSQL), fuzzystrmatch, hoặc full-text search với ngram parser (MySQL 5.7.6+), hoặc xử lý ở application layer (Levenshtein distance, fuzzy search).