[SQLSERVER] Hướng dẫn sử dụng chức năng tìm kiếm Full Text Search SQL SERVER 2016
Last updated
Last updated
Bài viết hôm nay, mình xin hướng dẫn các bạn sử dụng chức năng Full-Text Search trong Sqlserver. Trong bài viết này mình sử dụng Sqlserver 2016. Tuy nhiên, các bạn cũng có thể thực hiện bài viết này từ phiên bản Sqlserver 2008 trở đi.
Vậy Full-Text Search là gì? Và chúng ta sử dụng nó như thế nào?
Trong mỗi ứng dụng Application hay website thì chức năng tìm kiếm thì không bao giờ thiếu. Vậy nên chức năng tìm kiếm là rất quan trọng.
Như các bạn đã biết, thường tìm kiếm chúng ta thường sử dụng từ khóa "LIKE" để trả về cho chúng ta kết quả gần đúng. Tuy nhiên, trong thực tế thì với việc tìm kiếm sử dụng từ khóa "LIKE" đôi khi cho chúng ta kết quả không được mong muốn. Mình xin ví dụ:
Ví dụ:
Ở một trang web bán hàng, khi chúng ta đánh cụm từ “giày bóng dá”, người dùng mong muốn nhận được kết quả có từ: “giày bóng đá”, “bóng đá”, “đá bóng”,”giày”,”bóng”… Vị trí của các từ xuất hiện trong kết quả có thể không giống với cụm từ đưa vào, mà có sự đảo ngược lại, đồng nghĩa, trái nghĩa.
Các bạn thể tìm kiếm này bằng cách code, tuy nhiên chúng ta sẽ mất rất khó khăn và phức tạp.
Hiện tại các hệ quản trị cơ sở dữ liệu như SQL SERVER hay MY SQL đều có đã tích hợp sẵn chức năng FULL-TEXT search cho chúng ta sử dụng.
· Tìm từ đồng nghĩa (VD đưa vào là: “man”, sẽ tìm các từ có “man” và “men”).
· Tìm từ gần đúng, so từng từ trong cụm từ, đảo vị trí.
· Hỗ trợ tìm kiếm có đấu (VD đưa vào: “Giay bong da”, vẫn sẽ tìm ra kết quả “giày bóng đá”).
· Loại bỏ các từ khóa noise (nhiễu).
Hướng dẫn kiểm tra Full Text Search đã được cài đặt hay chưa:
Đầu tiên là cài đặt Full Text Search, quý vị mở SQL Studio Management, nếu câu lệnh trên cho kết quả 0 nghĩa là Full-text chưa được cài đặt.
Các bạn kiểm tra bằng câu truy vấn sau:
SQLCopy
Thử nghiệm Full-text Search dưới SQL
Để thử nghiệm Full-text Search, chúng ta cần có database. Tôi đã chuẩn bị sẵn cho các bạn 1 database sản phẩm với hơn 1000 entries. Các bạn có thể tải script database này tại đây
http://www.mediafire.com/view/srijhaz8090nj0g/fullTextDatabase.sql
Sau khi, cài đặt Full Text xong, chúng ta bắt đầu cài đặt catalog cho database
Các bạn vui lòng chọn Accent-insensitive. Và dưới đây là kết quả
Bước 2: Tạo full-text index cho cột Name của sản phẩm. Chúng ta có thể define Full-text index bằng câu lệnh query, nhưng mìnhsẽ hướng dẫn cách dùng Full-text Wizard.
Bước 3: Chọn bảng cần tạo full-text index, chọn define full-text index
Index này là khóa chính chứ ko phải Full-text Index, các bạn cẩn thận kẻo nhầm.
Bước 4: Các bạn check vào cột cần tạo index, tùy vào language của cột mà chọn (Mình cũng chưa rõ SQL Server có hỗ trợ tốt từ đồng nghĩa, gần nghĩa Tiếng Việt chưa, nhưng cứ chọn)
Chọn Automatically. Mỗi có thay đổi (Insert, update, delete), full-text index sẽ tự động cập nhật. Việc này sẽ làm quá trình insert/update/delete chậm đi.
Nếu chọn Manually, các bạn sẽ phải set-up schedule cập nhật index theo thời gian ở bước sau.
Như trên hình đã nói, nếu bảng của chúng ta khá lớn, hoặc catalog đã dùng để index 1 bảng khác, chúng ta nên tạo thêm catalog riêng cho bảng của mình.
Nếu ở bước trước các bạn chọn Manually, bước này các bạn nên set thời gian để table populate full-text index.
Vậy là các bước thực hiện tạo catalog trên database đã hoàn tất. Bây giờ, chúng ta bắt đầu test Full text search nó khác với "LIKE" như thế nào?
Ví dụ, chúng ta muốn tìm tất cả các sản phẩm có chữ “Bình” trong tên.
Ta cùng test thử với 3 câu query như sau
Như ta thấy, với câu query cuối cùng (Có CONTAINS, chúng ta chỉ cần chữ ‘binh’ là đã có kết quả đúng)
Ta thử tiếp với 2 câu query sau
Ta thấy, với kí tự “chu” đánh vào, toán tử LIKE cho kết quả có “chuột”, trong khi Full-text tìm các kết quả có từ “chữ”, “chủ”…, đúng với yêu cầu hơn.
Nếu muốn tìm toàn bộ những sản phẩm mà bên trong có từ “chu”, ta sửa lại câu lệnh Full-text. Thay ‘chu’ bằng ‘”*chu*”’
Câu lệnh query thứ 2 thường được sử dụng là FREETEXT.
VD trực quan, khi chúng ta muốn tìm sản phẩm honda wave
Toán tử FREETEXT tìm kiếm toàn bộ những sản phẩm có chữ “honda” và wave.
Giả sử chúng ta đổi từ khóa thành “wave honda”.
Toán từ LIKE và CONTAINS không cho kết quả nhưng toán tử FREETEXT vẫn cho kết quả đúng.
Ta sẽ tìm hiểu sơ qua lệnh FREETEXTTABLE
Ta đưa vào tên bảng, tên trường và cụm từ cần tìm. Bảng KEY_TBL được tạo ra sẽ gồm 2 trường là KEY và RANK. KEY chính là khóa chính của bảng đưa vào, RANK là độ gần đúng của từ đưa vào. VD như hình trên, những từ chứa cả “honda” và “wave” sẽ có rank cao hơn những từ chỉ chứa 1 trong 2.
Phần CONTAINS còn nhiều chức năng khá hay, các bạn có thể tìm hiểu thêm tại đây:
http://technet.microsoft.com/en-us/library/ms187787%28v=sql.105%29.aspx
http://technet.microsoft.com/en-us/library/ms142583.aspx
Lưu ý: Câu lệnh QUERY của Full-text ở mỗi hệ quản trị CSDL là khác nhau, đó đó câu lệnh Full-text bên MySQL, PostgreSQL và MS SQL là hoàn toàn khác nhau, không thể chuyển đổi qua lại giữa các hệ CSDL.
HAVE FUN :)