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

Tìm kiếm tương đối (fuzzy search) trong MySQL với hàm SOUNDEX()

Hàm SOUNDEX() trong MySQL trả về một mã âm thanh (soundex string) dài 4 ký tự đại diện cho cách phát âm của một chuỗi. Hai chuỗi nghe giống nhau (ví dụ: 'Smith' và 'Smyth') thường có cùng mã SOUNDEX. Điều này hữu ích cho tìm kiếm tên người, địa chỉ khi người dùng gõ sai chính tả.

Cú pháp

SELECT * FROM ten_bang 
WHERE SOUNDEX(gia_tri_tim_kiem) = SOUNDEX(ten_cot);

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

mysql> CREATE TABLE DemoTable (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    FirstName VARCHAR(20),
    LastName VARCHAR(20)
);

mysql> INSERT INTO DemoTable (FirstName, LastName) VALUES
('Adam', 'Smith'), ('David', 'Miller'), ('Carol', 'Taylor'),
('Chris', 'Brown'), ('John', 'Smith');

Dữ liệu

mysql> SELECT * FROM DemoTable;
+----+-----------+----------+
| Id | FirstName | LastName |
+----+-----------+----------+
|  1 | Adam      | Smith    |
|  2 | David     | Miller   |
|  3 | Carol     | Taylor   |
|  4 | Chris     | Brown    |
|  5 | John      | Smith    |
+----+-----------+----------+

Tìm kiếm tên 'Smith' (cả 'Smyth' nếu có)

mysql> SELECT * FROM DemoTable 
WHERE SOUNDEX('Smith') = SOUNDEX(LastName);

Kết quả

+----+-----------+----------+
| Id | FirstName | LastName |
+----+-----------+----------+
|  1 | Adam      | Smith    |
|  5 | John      | Smith    |
+----+-----------+----------+

Xem mã SOUNDEX của các giá trị

mysql> SELECT LastName, SOUNDEX(LastName) FROM DemoTable;
+----------+-------------------+
| LastName | SOUNDEX(LastName) |
+----------+-------------------+
| Smith    | S530              |
| Miller   | M460              |
| Taylor   | T460              |
| Brown    | B650              |
| Smith    | S530              |
+----------+-------------------+

Hạn chế của SOUNDEX

  • Chỉ hoạt động tốt với tiếng Anh.
  • Không phân biệt được nhiều từ có phát âm giống nhau nhưng viết khác hoàn toàn.
  • Không sử dụng index (full table scan).

Thay thế hiện đại: MySQL 8.0+ hỗ trợ FULLTEXT SEARCH với ngram parser cho tiếng Việt/CJK, hoặc dùng extension như pg_trgm (PostgreSQL), Elasticsearch cho tìm kiếm mờ chuyên nghiệp.