MySQL Full-Text Search

Post Reply
User avatar
stararound
Posts: 23
Joined: Wed Apr 17, 2019 1:29 pm

MySQL Full-Text Search

Post by stararound »

Full text search là gì?
  • Full text search (FTS) là kĩ thuật tìm kiếm toàn văn cho phép người dùng tìm kiếm các mẩu thông tin khớp với một chuỗi trên một cột hay một số cột nhất định trong table.
  • Một chỉ mục toàn văn trong MySQL là một chỉ mục có kiểu FULLTEXT. Các chỉ mục FULLTEXT chỉ được dùng với các bảng InnoDB hoặc MyISAM, và chỉ có thể tạo ra cho các cột CHAR, VARCHAR, hay TEXT.
  • Sử dụng cơ chế ranking (ranking dựa trên mức độ phù hợp của kết quả tài liệu tìm thấy, tài liệu trả về càng phù hợp thì có số rank càng cao)
Tạo chỉ mục FULLTEXT

ALTER TABLE news ADD FULLTEXT (col1, col2, col3);

Full text search thực hiện bằng cú pháp: MATCH (col1,col2,...) AGAINST (expr [search_modifier])

MATCH lấy danh sách các column đã chỉ định chỉ mục FTS, phân tách nhau bằng dấu phẩy. AGAINST chỉ định một chuỗi để tìm kiếm và một tùy chọn cho biết loại tìm kiếm nào sẽ thực hiện. Chuỗi tìm kiếm phải là một giá trị chuỗi không đổi trong quá trình đánh giá truy vấn.

Có 3 options Full text search
  • NATURAL LANGUAGE MODE
  • BOOLEAN MODE
  • WITH QUERY EXPANSION
1. Natural Language Full-Text Search (NATURAL LANGUAGE MODE)

Mặc định hàm MATCH () thực hiện tìm kiếm ngôn ngữ tự nhiên cho một chuỗi cần tìm kiếm trên một collection (một hoặc một số cột đã được đánh chỉ mục FULLTEXT), kể cả chỉ định hoặc không chỉ định NATURAL LANGUAGE MODE. Chuỗi tìm kiếm được đưa vào làm đối số cho AGAINST (). Đối với mỗi hàng trong bảng, MATCH () trả về giá trị liên quan; nghĩa là, một phép đo tương tự giữa chuỗi tìm kiếm và văn bản trong hàng đó trong các cột chỉ định trong danh sách MATCH ().

Code: Select all

mysql> CREATE TABLE articles (
          id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
          title VARCHAR(200),
          body TEXT,
          FULLTEXT (title,body)
        ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.08 sec)

mysql> INSERT INTO articles (title,body) VALUES
        ('MySQL Tutorial','DBMS stands for DataBase ...'),
        ('How To Use MySQL Well','After you went through a ...'),
        ('Optimizing MySQL','In this tutorial we will show ...'),
        ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
        ('MySQL vs. YourSQL','In the following database comparison ...'),
        ('MySQL Security','When configured properly, MySQL ...');
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM articles
        WHERE MATCH (title,body)
        AGAINST ('database' IN NATURAL LANGUAGE MODE);
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)
Bạn có thể sử dụng hệ số điểm liên quan (Relevance Score) kết quả tìm kiếm để có thể hiển thị theo mức độ liên quan của kết quả tìm kiếm, ví dụ: 0 là kết quả không liên quan gì, càng lớn hơn so với 0 điểm thì mức độ liên quan với từ khóa tìm kiếm càng cao.

Code: Select all

mysql> SELECT id, MATCH (title,body)
    AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) AS score
    FROM articles;
+----+---------------------+
| id | score               |
+----+---------------------+
|  1 | 0.22764469683170319 |
|  2 |                   0 |
|  3 | 0.22764469683170319 |
|  4 |                   0 |
|  5 |                   0 |
|  6 |                   0 |
+----+---------------------+
6 rows in set (0.00 sec)
2. Boolean Full-Text Search (BOOLEAN MODE)

MySQL có thể thực hiện tìm kiếm toàn văn bản boolean bằng cách sử dụng chỉ định IN BOOLEAN MODE. Với công cụ sửa đổi này, một số ký tự nhất định có ý nghĩa đặc biệt ở đầu hoặc cuối từ trong chuỗi tìm kiếm. Trong truy vấn sau đây, các toán tử + và - chỉ ra rằng một từ phải có mặt hoặc vắng mặt, tương ứng, để một kết quả khớp xảy ra. Do đó, truy vấn lấy tất cả các hàng có chứa từ MySQL nhưng không chứa từ YourSQL:

Code: Select all

mysql> SELECT * FROM articles WHERE MATCH (title,body)
    AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+----+-----------------------+-------------------------------------+
| id | title                 | body                                |
+----+-----------------------+-------------------------------------+
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...        |
|  2 | How To Use MySQL Well | After you went through a ...        |
|  3 | Optimizing MySQL      | In this tutorial we will show ...   |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ... |
|  6 | MySQL Security        | When configured properly, MySQL ... |
+----+-----------------------+-------------------------------------+
3. Full-Text Search with Query Expansion

Full-Text Search hỗ trợ mở rộng truy vấn (và đặc biệt là mở rộng truy vấn mù biến thể của nó). Điều này thường hữu ích khi cụm từ tìm kiếm quá ngắn, có nghĩa là người dùng đang dựa vào kiến ​​thức ngụ ý (bao hàm) mà công cụ tìm kiếm toàn văn thiếu. Ví dụ, một người dùng đang tìm kiếm "database" trên Google, có thể từ ngữ họ thực sự muốn tìm là: MySQL, Oracle Oracle, DB2 hay RDBMS, tất cả đều là những cụm từ phù hợp với cơ sở dữ liệu. Đây gọi là là kiến ​​thức ngụ ý.

Truy vấn mù (còn được gọi là phản hồi liên quan tự động) được enable bằng cách thêm WITH QUERY EXPANSION hoặc IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION sau cụm từ tìm kiếm.

Code: Select all

mysql> SELECT * FROM articles
    WHERE MATCH (title,body)
    AGAINST ('database' IN NATURAL LANGUAGE MODE);
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM articles
    WHERE MATCH (title,body)
    AGAINST ('database' WITH QUERY EXPANSION);
+----+-----------------------+------------------------------------------+
| id | title                 | body                                     |
+----+-----------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL     | In the following database comparison ... |
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...             |
|  3 | Optimizing MySQL      | In this tutorial we will show ...        |
|  6 | MySQL Security        | When configured properly, MySQL ...      |
|  2 | How To Use MySQL Well | After you went through a ...             |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ...      |
+----+-----------------------+------------------------------------------+
6 rows in set (0.00 sec)
Một chú ý quan trọng bạn cần phải nhớ:

Đối với các tập dữ liệu lớn, việc tải dữ liệu của bạn vào một bảng không có chỉ mục FULLTEXT sẽ nhanh hơn nhiều và sau đó mới tạo chỉ mục sau, hơn là tải dữ liệu vào một bảng đang có chỉ mục FULLTEXT.

Post Reply