Tìm kiếm toàn văn trong MySQL
Khi d liu ngày càng nhiu thì vn đề tìm kiếm thông tin chính xác
càng tr nên quan trng. Vi khi lượng d liu ln và có t chc
phc tp, vn đề đặt ra là làm thế nào để tìm nhanh và đúng thông tin
cn. Người dùng không mun tìm kiếm mt t mà li có c triu câu
tr li, h cn s chính xác và loi b các t gây nhiu. Lúc đó, người
dùng s cn đế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 ct VARCHAR và TEXT được đánh ch mc vi FULLTEXT có th dùng được
vi các câu lnh SQL đặc bit để thc hin vic tìm kiếm toàn văn trong MySQL. Đến bn 4.1,
tính năng này tr nên hoàn thin vi s h tr đầy đủ tìm kiếm boolean.
Tìm kiếm toàn văn trong MySQL
TKTV là mt chc năng có trong MySQL cho phép người dùng tìm kiếm các mu thông tin
khp vi mt chui trên mt hay mt s bng nht định, hơn là tìm s so khp dng "SELECT
LIKE" trên tng hàng ca mt trường nào đó.
Mt ch mc toàn văn trong MySQL là mt ch mc có kiu FULLTEXT. Các ch mc
FULLTEXT ch được dùng vi các bng MyISAM và có th được to ra t các ct CHAR,
VARCHAR, hay TEXT vào lúc to bng vi CREATE TABLE hay b sung sau vi ALTER
TABLE hoc CREATE INDEX.
Ch mc TKTV rt ging vi các ch mc khác: nó là mt danh sách các khóa được xếp theo trt
t. Các khóa này ch đến các bn ghi nm trong file d liu. Mi khóa gm (định dng ca phiên
bn 4.1):
{
Word -- VARCHAR. Mt t bên trong phn văn bn.
Count -- LONG. T đó xut hin bao nhiu ln trong phn văn bn.
}
{
Weight -- FLOAT. Đánh giá v tm quan trng ca t.
Rowid -- mt con tr ch đến hàng c th nm trong file d liu.
}
Mt s đặc đim chính ca tính năng TKTV trong MySQL:
• T loi b các t có ít hơn 4 ch cái.
• Các t có gch ngang nm gia được xem là 2 t.
• Các hàng được tr li theo th t thích hp, t cao xung thp
• Các t nm trong danh sách t ph thông bng tiếng Anh cũng b loi b khi danh sách kết
qu tìm kiếm. Danh sách t này nm trong file myisam/ft_static.c. Khi bn cn lc các t thông
dng cho mt ngôn ng khác, ví d tiếng Vit thì bn cn chnh li file này, biên dch li
MySQL, và xây dng li các ch mc!
Chun b d liu
Chúng ta th trin khai mt ví d đơn gin để hình dung rõ hơn v cơ chế hot động ca TKTV.
Đầu tiên, chúng ta to ra mt CSDL tên goldenkey t ca s dòng lnh (console) ca MySQL:
Tiếp theo, chúng ta to ra mt bng dùng mnh đề FULLTEXT ca MySQL để ch định nhng
trường mà chúng ta mun đánh ch mc cho vic 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),
unique id(pk_id),
fulltext(firstName, lastName, details)
) ENGINE=MyISAM;
Sau khi thc hin câu lnh này, bn được mt bng có cu trúc như sau:
Trường pk_id đầu tiên được dùng làm khóa chính. Chúng ta đã dùng mnh đề FULLTEXT để
đánh ch mc cho nhóm 3 trường là firstName, lastName và details.
Nếu đã lp bng như trên và mun thay đổi trường có ch mc, bn dùng lnh sau:
ALTER TABLE Staff ADD FULLTEXT(field1, field2);
đây, bn chú ý dòng fulltext(firstName, lastName, details). Dòng này thông báo cho MySQL
thiết lp mt ch mc lên các trường firstName, lastName và details ca bng Staff. Các ch mc
ch có th được to ra trên các trường có kiu là VARCHAR và TEXT. Khi các trường này đã có
ch mc thì CSDL đã sn sàng cho vic khai thác tính năng TKTV để tìm các bn ghi phù hp
yêu cu tìm kiếm da trên các giá tr có trong ba trường này.
Để th nghim, chúng ta b sung d liu vào bng mi to bng các câu lnh sau:
insert into Staff values(0, Jeff, Holmes, 52, 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.);
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 bng d liu ln, khi d liu càng ln thì kết qu tr v
càng đáng tin cy.
Thc hin tìm kiếm
S dng lnh TKTV:
select firstName from Staff where match(firstName, lastName, details) against(business);
Kết qu tr li như sau:
Chúng ta s phân tích để thy được s khác bit. Đầu tiên, xem xét phn SELECT và FROM
trong câu truy vn:
select firstName from Staff
đây không có gì khác bit so vi các câu SELECT bình thường khác. Nhưng s khác bit nm
phn mnh đề WHERE tiếp sau đó:
where match(firstName, lastName, details) against(business);
Đây chính là ch phát huy sc mnh ca TKTV. Trong phn đầu ca câu truy vn này, bn dùng
câu lnh MATCH. Lnh này s tiến hành so khp yêu cu tìm kiếm vi các giá tr ca các trường
firstName, lastName và details.
Khi câu lnh MATCH được s dng trong mnh đề SELECT nó s tr li mt th t sp xếp
theo mc độ thích hp, được xác định bng mt con s thp phân dương. S này càng gn vi 0
thì bn ghi càng kém thích hp. Giá tr thích hp này được xác định da trên biu thc tìm kiếm,
s t có trong các trường được đánh ch mc cũng như tng s bn ghi được tìm kiếm.
Câu lnh AGAINST ch chp nhn mt tham s. Đó là chui mà chúng ta cn tìm.
Tuy nhiên, cho đến bây gi chúng ta vn chưa thy được s khác bit vi cách tìm kiếm truyn
thng da trên câu lnh LIKE:
select firstName from Staff where details like business;
Bn hãy thc hin câu lnh trên để xem chúng có tr v cùng mt tp kết qu không? Câu tr li
có th là: có và không. Chính s can thip ca th t sp xếp theo mc độ thích hp đã làm cho
tp kết qu này có s sai khác vi tp kết qu có t TKTV.
Sp xếp theo độ thích hp
Để kim tra con s đánh giá mc độ thích hp, chúng thc hin câu lnh truy vn 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 li như sau:
Trong câu truy vn này, chúng ta s dng lnh MATCH trong mnh đề SELECT để gi tr li
ch s đánh giá mc độ thích hp cho mi bn ghi. Câu lnh trên thc hin vic TKTV trên các
trường firstName, lastName và details để so khp chui "business":
where match(firstName, lastName, details) against(business);
Câu lnh truy vn này tr v hai bn ghi có cha chui "business" nm mt trong các trường
firstName, lastName hay details. Bây gi chúng ta s xem li các bn ghi có cha chui
"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, please 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."
"Mr. Jason Bell is a business assistant in Golden Key. He graduated from London Business
Management School. His major is Law in Business."
Trường relevance tr li t câu truy vn ca chúng ta được to ra t chui lnh sau:
match(firstName, lastName, details) against(business) as relevance