You are on page 1of 25

FULL-TEXT SEARCH

2
Full-text Search
Full-text search (gọi tắt là FTS) là cách tự nhiên
nhất để tìm kiếm thông tin. Không tìm kiếm từ
theo dạng word-for-word, mà đoán ý người dùng
muốn để học cách tìm ra phù hợp nhất.
Vấn đề cần tìm hiểu
Inverted Index
Tokenize
Boolean Logic
Ranking
3 inverted index
Để tạo ra Inverted Index:
Tạo index theo đơn vị term
4 Tokenize:
Tách chuỗi làm sao để có được tập hợp index ?
Có 2 kỹ thuật cơ bản giải quyết bài toán
N-gram và Morphological Analysis (MA)
5

N-gram là tách một chuỗi thành các chuỗi


con, thông qua việc chia đều chuỗi đã có
thành các chuỗi con đều nhau, có độ dài là
N.
Ví dụ:
"Hello world!" => {"He", "ll", "o ", "wo", "rl", "d!"}
6

Morphological Analysis là một kĩ thuật


phổ biến trong xử lý ngôn ngữ tự nhiên
(Natural Language Processing), tách một
chuỗi ra thành các từ có ý nghĩa.
Nhưng để xây dựng MA thì cần một bộ từ điển
tốt, để giúp cho máy tính có thể phân biệt
được các từ có nghĩa.
7 Boolean Logic và Ranking
Boolean logic sử dụng trong Search
Engine thường sẽ gồm 3 phép toán chính
là AND, NOT và OR
Ranking
Khi kết quả tìm kiếm chỉ có 1 hoặc 2 thì không
vấn đề gì, nhưng kết quả là rất nhiều thì có vấn
đề xảy ra, đó là đưa kết quả nào lên trước, hay
chính là bài toán về Ranking.
8

Xếp rank không phụ thuộc vào mối quan hệ ngữ nghĩa
giữa “query term” và “document”
Được xác định dựa trên lý thuyết "độ quan trọng của
document phụ thuộc vào mối quan hệ giữa các
document với nhau".
Ví dụ: page rank để sắp sếp kết quả tìm kiếm website
của Google. Ý tưởng của PageRank là “Page nào càng
được nhiều link tới, và được link tới bởi các page càng
quan trọng, thì score càng cao”. (Vì thế có 1 thủ thuật
SEO là đi đặt link của mình vào càng nhiều website càng
tốt).
9

Xếp rank dựa vào mối quan hệ giữa “query


term” và “document”.
Các thuật toán thường dựa vào:
tần suất xuất hiện của “query term” trong document
dựa vào các đặc tính ngữ nghĩa (semantic) của query
term
thứ tự xuất hiện các từ trong “query term” và thứ tự
xuất hiện trong “document”
...
10
Full-text search trong MySQL
Ví dụ: SELECT id,title,description FROM
book WHERE title LIKE ‘%keyword%’
• Khi không đánh index thì tốc độ tìm kiếm chậm.
• Kết quả tìm kiếm nhiều nhưng độ nhiễu cao.
• Ví dụ: one => kết quả: zone, phone, money,...
11 Full-Text Search trong MySQL
Để sử dụng
Lập full-text index là FULLTEXT
Dùng hàm MATCH
Hỗ trợ 2 loại bảng: MyISAM và InnoDB
Hỗ trợ trên kiểu dữ liệu: CHAR, VARCHAR, TEXT
Có 3 chế độ: IN NATURAL LANGUAGE MODE, IN
BOOLEAN MODE, WITH QUERY EXPANSION
12
Nhược điểm
Note: Some words are ignored in full-text searches.
• The minimum length of the word for full-text
searches as of follows :
• Three characters for InnoDB search indexes.
• Four characters for MyISAM search indexes.
• Stop words are words that are very common such as
'on', 'the' or 'it', appear in almost every document.
These type of words are ignored during searching.
13
Tạo bảng
CREATE TABLE table_name(
column_list, ..., FULLTEXT
(column1,column2,..) );
ALTER TABLE table_name ADD
FULLTEXT(column_name1,
column_name2,…)
14

CREATE TABLE articles ( id INT


UNSIGNED AUTO_INCREMENT NOT NULL
PRIMARY KEY, title VARCHAR(200), body
TEXT, FULLTEXT (title,body) )
ENGINE=InnoDB;
15
Sử dụng full-text
MATCH (column1,column2,column3...) AGAINST
(expression [search_modifier])
Hàm MATCH chỉ ra sẽ tìm kiếm trên cột nào
Hàm AGAINST chỉ ra biểu thức tìm kiếm (hay chính là
cụm từ tìm kiếm theo ngôn ngữ tự nhiên mà người dùng
nhập vào)
SELECT * FROM articles where MATCH
(title,body) AGAINST ('database Tutorial')
16
IN NATURAL LANGUAGE MODE
SELECT * FROM table WHERE
MATCH(column) AGAINST(“string” IN
NATURAL LANGUAGE MODE);
MATCH() dùng với WHERE: dòng tự sắp xếp
theo điểm số từ cao đến thấp.
Chế độ mặc định
17
IN NATURAL LANGUAGE MODE
Ví dụ:
select * from questions where match(query,reply) ag
ainst("thời gian")

select query, match(query,reply) against("thời


gian học") as score from questions where
match(query,reply) against("thời gian học")
18
WITH QUERY EXPANSION
Tìm kiếm với mở rộng truy vấn
Đầu tiên, tìm kiếm tất cả các hàng khớp với truy
vấn tìm kiếm.
Thứ hai, tìm các từ có liên quan trong tất cả các
hàng từ kết quả tìm kiếm.
Thứ ba, tìm kiếm lại dựa trên các từ có liên quan
thay vì các từ khóa ban đầu được chỉ định bởi
người dùng.
19
WITH QUERY EXPANSION
Nên tìm mở rộng khi nào:
Mở rộng truy vấn khi kết quả tìm kiếm quá ít.
Thực hiện lại các tìm kiếm với việc mở rộng truy vấn
nhằm cung cấp cho người dùng nhiều thông tin liên
quan và phù hợp với những gì họ đang tìm kiếm.
Ví dụ:
select * from questions where match(query,reply) ag
ainst("thời gian" with query expansion)
20
IN BOOLEAN MODE
Theo tìm kiếm tự nhiên thì trong văn bản chỉ
cần xuất hiện một trong số những từ mà ta
đặt nó ở đầu vào là sẽ trả kết quả về.
Tuy nhiên có một số trường hợp muốn phải
xuất hiện ít nhất 2 từ nào đó thì lúc này phải
sử dụng các chế độ MODE
21

select * from questions where


match(query,reply) against("+thời +gian" in
boolean mode)
22 + Từ phải xuất hiện
– Từ không được xuất hiện
> Bao gồm từ này, và tăng giá trị xếp hạng
< Bao gồm từ này, và giảm giá trị xếp hạng
() Nhóm các từ thành các biểu thức con (cho phép chúng được bao gồm, loại trừ, xếp
hạng, v.v. như một nhóm).

~ Phủ định một từ được xếp hạng


* Ký tự đại diện ở cuối từ
“” Xác định một cụm từ (trái ngược với danh sách các từ riêng lẻ, toàn bộ cụm từ được
khớp để đưa vào hoặc loại trừ).
23

Ví dụ:
Để tìm kiếm các hàng có ít nhất một trong hai từ: mysql
hoặc tutorial
mysql tutorial
Để tìm các hàng xuất hiện cả hai từ mysql
và tutorial.
+mysql +tutorial
Để tìm các hàng bắt buộc có từ mysql nhưng
từ tutorial thì có thể có hoặc không
+mysql tutorial
24

Để tìm các hàng xuất hiện từ mysql nhưng không được
xuất hiện từ tutorial.
+mysql –tutorial
Để tìm kiếm các hàng có chứa từ mysql và xếp hạng
hàng thấp hơn nếu nó chứa từ tutorial.
+mysql ~tutorial
 Để tìm kiếm các hàng có chứa các từ mysql và tutorial
hoặc training, nhưng đặt các hàng có chứa mysql
tutorial cao hơn so với mysql training.
+mysql +(>tutorial <training)
25

select * from questions where match(query,reply)


against("+thời + (đại học)" in boolean mode)
select * from questions where match(query,reply)
against("+thời +‘đại học’" in boolean mode)

You might also like