Tìm kiếm toàn văn trong MySQL
Ngu
ồ
n:quantrimang.com
Khi dữ liệu ngày càng nhiều thì vấn đề tìm kiếm thông tin chính xác càng trở nên
quan trọng. Với khối lượng dữ liệu lớn và có tổ chức phức tạp, vấn đề đặt ra là
làm thế nào để tìm nhanh và đúng thông tin cần. Người dùng không muốn tìm
kiếm một từ mà lại có cả triệu câu trả lời, họ cần sự chính xác và loại bỏ các từ
gây nhiễu. Lúc đó, người dùng sẽ c
ần đến tính năng tìm kiếm toàn văn.
Tìm kiếm toàn văn (TKTV) đã được hỗ trợ trong MySQL version 3.23.23. Các cột
VARCHAR và TEXT được đánh chỉ mục với FULLTEXT có thể dùng được với
các câu lệnh SQL đặc biệt để thực hiện việc tìm kiếm toàn văn trong MySQL.
Đến bản 4.1, tính năng này trở nên hoàn thiện với sự hỗ trợ đầy đủ tìm kiếm
boolean.
Tìm kiếm toàn văn trong MySQL
TKTV là một chức năng có trong MySQL 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 hay một số bảng nhất định, hơn là tìm
sự so khớp dạng "SELECT LIKE" trên từng hàng của một trường nào đó.
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 MyISAM và có thể được tạo ra từ
các cột CHAR, VARCHAR, hay TEXT vào lúc tạo bảng với CREATE TABLE hay
bổ sung sau với ALTER TABLE hoặc CREATE INDEX.
Chỉ
mục TKTV rất giống với các chỉ mục khác: nó là một danh sách các khóa
Khi bạn cần lọc các từ thông dụng cho một ngôn ngữ khác, ví dụ tiếng Việt thì
bạn cần chỉnh lại file này, biên dịch lại MySQL, và xây dựng lại các chỉ mục!
Chuẩn bị dữ liệu
Chúng ta thử triển khai một ví dụ đơn giản để hình dung rõ hơn về cơ chế hoạt
động của TKTV.
Đầu tiên, chúng ta tạ
o ra một CSDL tên goldenkey từ cửa sổ dòng lệnh (console)
của MySQL:
Tiếp theo, chúng ta tạo ra một bảng dùng mệnh đề FULLTEXT của MySQL để
chỉ định những trường mà chúng ta muốn đánh chỉ mục cho việc tìm kiếm:
create table Staff
(
pk_id int auto_increment not null,
firstName varchar(20),
lastName varchar(20),
age int,
details text,
primary key(pk_id),
Golden Key. He likes Business, Technology and Finance. He is responsible for
English for Information Technology course in Golden Key.);
insert into Staff values(0, Beth, Adams, 29, Mrs. Beth Adams is the Director of
Studies of Golden Key Language Center. She was born in England. She is very
nice and professional.);
insert into Staff values(0, Jason, Bell, 33, Mr. Jason Bell is a business assistant
in Golden Key. He graduated from London Business Management School. His
major is Law in Business.);
Chú ý là TKTV được thiết kế cho các bảng dữ liệu lớn, khi dữ liệu càng lớn thì
kết quả trả về càng đáng tin cậy.
Thực hiện tìm kiếm
Sử dụng lệnh TKTV:
select firstName from Staff where match(firstName, lastName, details)
against(business);
K
ết quả trả lại như sau:
Chúng ta sẽ phân tích để thấy được sự khác biệt. Đầu tiên, xem xét phần
SELECT và FROM trong câu truy vấn:
select firstName from Staff
Ở đây không có gì khác biệt so với các câu SELECT bình thường khác. Nhưng
Để kiểm tra con số đánh giá mức độ thích hợ
p, chúng thực hiện câu lệnh truy
vấn sau:
select concat(firstName, , lastName) as name, match(firstName, lastName,
details) against(business) as relevance from Staff where match(firstName,
lastName, details) against(business);
Kết quả trả lại như sau:
Trong câu truy vấn này, chúng ta sử dụng lệnh MATCH trong mệnh đề SELECT
để gửi trả lại chỉ số đánh giá mức độ thích hợp cho mỗi bản ghi. Câu lệnh trên
thực hiện việc TKTV trên các trường firstName, lastName và details để so khớp
chuỗi "business":
where match(firstName, lastName, details) against(business);
Câu lệnh truy vấn này trả về hai bản ghi có chứa chuỗi "business" nằm ở một
trong các trường firstName, lastName hay details. Bây giờ chúng ta sẽ xem lại
các bản ghi có chứa chuỗi "business":
"Ms. Nguyen Hoang Ly is the Marketing and Business Development Manager In
Golden Key Language Center. If you want to talk about business cooperation,
p
lease call her."
"Mr. Jeff Holmes is a senior teacher in Golden Key. He likes Business,
Technology and Finance. He is responsible for English for Information
Technology course in Golden Key."
select firstName, match(firstName, lastName, details) against(he likes business)
as relevance from Staff;
Kết quả của câu truy vấn này như sau:
Chú ý, câu truy vấn cuối cùng của chúng ta có hai từ có độ dài hơn 3 kí tự là,
"business" và "likes". Nếu chúng ta xóa bỏ từ có dưới 3 kí tự kia đi thì chúng ta
sẽ có kết quả về chỉ số thích hợp tương tự như trên:
select firstName, match(firstName, lastName, details) against(likes business) as
relevance from Staff;
Kết quả trả lại như sau:
Như vậy, chúng ta vẫn có kết quả trả lại tương tự. Điều này chứng tỏ MySQL đã
xóa bỏ các từ gây nhiễu và các từ có từ 3 kí tự trở xuống ra khỏi câu truy vấn.
Chức năng TKTV của MySQL xếp hạng các từ dựa trên giá trị ngữ nghĩa của
chúng – các từ thông dụng thì xếp hạng thấp hơn các từ không thông dụng. Điều
này có ý nghĩa, vì một từ
tồn tại trong nhiều bản ghi sẽ có tính thích hợp ít hơn
so với một từ chỉ xuất hiện trong một hay hai bản ghi. Việc xếp hạng thích hợp
theo ý nghĩa được sử dụng ở phần lớn các thuật toán TKTV phổ biến.
Giới hạn 50%
MySQL loại bỏ các từ gây nhiễu và các từ ngắn nhưng nếu một từ không ngắn
nhưng hiện diện ở h
ơn 50% số bản ghi được tìm kiếm thì các bản ghi đó sẽ
• * Một dấ
u hoa thị là toán tử cắt bỏ. Không giống như các toán tử khác, nó được
nối vào từ chứ không phải đặt nó ở trước từ.
• "Mệnh đề được đặt trong dấu nháy kép", sẽ chỉ so khớp với các hàng có chứa
mệnh đề đó.
Một tìm kiếm boolean được thực hiện khá giống với TKTV bình thường. Tuy
nhiên, nó chứa từ khóa IN BOOLEAN MODE, như ví dụ dưới đây:
select * from Staff where match(firstName, lastName, details) against (+business
-English in boolean mode);
Trong câu truy v
ấn trên, chúng ta đã ra lệnh rằng tất cả các hàng trả lại phải
chứa từ "business" và không được chứa từ "English". Tương tự, chúng ta thử
thực hiện câu truy vấn dưới đây:
select firstName, match(firstName, lastName, details) against(+English -business
>manager in boolean mode) as relevance from Staff where match(firstName,
lastName, details) against(+ English - business > manager in boolean mode);
Nhìn vào câu truy vấn ở trên ta thấy hàng trả lại sẽ được xếp ở vị trí cao hơn
nếu:
• Nó chứa từ "English"
• Nó không chứa từ "business"