Giới thiệu về Full Text Search.

I. Full text search là gì?

Nói đơn giản dễ hiểu, full text search (gọi tắt là FTS) là cách tự nhiên nhất để tìm kiếm thông tin, hệt như Google, ta chỉ cần gõ từ khóa và nhấn enter thế là có kết quả trả về. Phạm vi bài viết này chỉ đề cập, giới thiệu sơ lược về FTS trong MySQL mà không bàn về các FTS engine như Sphinx hay Solr. im.jpg

II. Tại sao chúng ta phải dùng Full text search?

Bình thường, chúng ta sẽ sử dụng câu truy vấn dạng như sau để tìm kiếm dữ liệu:

SELECT id,title,description FROM book WHERE title LIKE ‘%keyword%’

Nhưng cách truy vấn này có một số hạn chế sau:

  • 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, từ đồng nghĩa nhiều.
  • Gặp vấn đề trong tìm kiếm tiếng việt có dấu và không dấu.

(Lưu ý: đó là những hạn chế chung trong MySQL, ngay cả full text search của MySQL cũng không giải quyết triệt để các vấn đề này mà phải dùng các search engine ngoài như Solr, Sphinx v.v )

III. Một số đặc tính khi sử dụng full text search:

**A. Ưu điểm: **

  1. Kết quả search trả về nhiều.

  2. Khi đánh index thì tốc độ search Nhanh:

Index là 1 file riêng biệt được lưu trữ ở máy chủ và chỉ chứa những Fields mà bạn muốn nó chứa. Nếu bạn tạo 1 Index cho Field user_id (mã số người dùng), MySQL sẽ dễ dàng tìm ra được mã số 1 cách nhanh chóng. Trở lại ví dụ quyển sách, khi cần tìm 1 thông tin, ta thường lật ngay tới phần “Mục Lục” và tìm từ đó để tăng tốc độ tìm. Và việc tạo ra Index này sẽ làm bạn thấy Database của bạn chạy nhanh 1 cách khác thường.

inverted_index.png

3 . Tối ưu hơn việc sử dụng LIKE khi thao tác với các trường text lớn.

B. Nhược điểm:

  1. Độ chính xác thấp image03.jpg
  • Độ nhiễu cao

Giả sử, bạn có câu truy vấn với mệnh đề LIKE như sau: Title LIKE ‘%one%’ Thì nó sẽ có thể trả về những kết quả sau: one, zone, money, phone Dải kết quả trả về sẽ rộng và có thể chứa nhiều kết quả nhiễu không mong muốn.

  • Từ đồng nghĩa (synonyms)

Như chúng ta đã biết, ngôn ngữ nào cũng có những từ đồng nghĩa, ví dụ như trong tiếng Việt là xe hơi - ôtô, bao thư - phong bì v.v. Tiếng Anh thì đơn giản thì có color-colour, check-cheque, deloper-programmer v.v Nếu như dùng LIKE hay = (thậm chí Full-text search của MySQL) thì tất nhiên không thể giải quyết được vấn từ đồng nghĩa này.

  • Từ cấu tạo bằng chữ đầu của cụm từ (acronym)

Đôi lúc với những cụm từ dài và phổ biến chúng ta thường viết tắtví dụ như THPT, CNTT, US, IT. Nhưng khi người dùng tìm kiếm thì họ có thể nhập khác với trong database chúng ta lưu trữ (viết thu gọn - viết đủ và ngược lại) cho nên đây cũng là một khó khăn mà chúng ta gặp phải khi làm chức năng search. Mong muốn của người dùng là họ tìm thấy được kết quả mong muốn cho dù họ viết tắt hay viết đầy đủ) 2. Tốc độ truy vấn chậm, khi‘%keyword%’ không dùng index 1372474577_k-bigpic.jpg

Nếu như ta đặt wildcard ‘%’ ở phía trước thì MySQL sẽ thực hiện câu truy vấn mà không dùng index, MySQL sẽ thực hiện scan toàn bộ dữ liệu của nó từ đầu đến cuối, cho nên câu truy vấn sẽ rất chậm so với search trên index. Giống như ta tìm từng trang trong một cuốn sách thay vì tìm trong trang index đằng sau quyển sách đó vậy.

3 . Vấn đề với tìm kiếm tiếng Việt có dấu và không dấu tieng-anh120.png

Giả sử ta lưu tiếng Việt có dấu trong database, nhưng người dùng nhập tiếng Việt không dấu thì mệnh đề LIKE chắc chắn sẽ không tìm ra được dữ liệu ta cần.

Có một số giải pháp ví dụ như lưu 2 field, một có dấu và một không dấu, nhưng cách này xem ra không tối ưu và không hỗ trợ search gần đúng. Nếu như người dùng nhập “co be mua dong” thì dùng mệnh đề LIKE sẽ không search ra được “Cô bé mùa Đông”, nhưng FTS có thể giải quyết vấn đề này.

IV. Tổng kết: day2.png

Bài viết đã giới thiệu chung và một số tính năng về Full Text Search Engine. Qua đó các bạn chắc đã hình dung ra phần nào khi các bạn gõ một câu lệnh tìm kiếm vào ô tìm kiếm của Google, những gì sẽ xảy ra đằng sau (mặc dù trên thực tế những gì google làm sẽ phức tạp hơn rất nhiều).


All Rights Reserved