Cài đặt và sử dụng Full-text Search trong ứng dụng J2EE với SQL Server 2008

Cài đặt và sử dụng Full-text Search trong ứng dụng J2EE với SQL Server 2008

Tác giả: Phạm Huy Hoàng

Mục đích: Mục đích của bài viết này nhằm hướng dẫn cách cài đặt và sử dụng Full-text Search trong ứng dụng J2EE/JavaEE. Hệ quản trị CSDL chúng tôi sẽ sử dụng trong bài viết này là SQL Server 2008.

Yêu cầu

  • JDK 6 Update 22
  • Netbeans 6.9.1
  • SQL Server 2008 (Express, R2 đều được)

Giới thiệu

Chức năng Search là 1 trong những chức năng vô cùng cơ bản của mỗi ứng dụng (Chỉ sau chức năng Login, Authorization). Hiện nay, đa phần chúng ta thực hiện chức năng search bằng toán tử LIKE dưới SQL, hoặc method contains của kiểu dữ liệu String trên code.

Trên thực tế, việc tìm kiếm diễn ra một cách phức tạp hơn nhiều. VD như ở 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 ….

Những yêu cầu trên có thể được giải quyết bằng code, nhưng công việc đó khá khó khăn và phức tạp. Hiện tại 2 CSDL MySQL và SQL Server đều đã tích hợp Full-text Search, giúp giải quyết những vấn đề:

· 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 cài đặt

Đầ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.

Nếu kết quả 1, Full-text đã được cài đặt, quý vị có thể skip bước này xuống phần dưới

Description: C:UsersHoangDesktopbefore2.JPG

Description: C:UsersHoangDesktopbefore.JPG

Nếu quý vị chưa cài SQL, vui lòng cài bản đầy đủ, khi cài nhớ check Full-text. Bài hướng dẫn này chỉ hướng dẫn cho quý vị đã cài SQL bản bình thường, chưa có Full-text (trên hình)

Nếu sử dụng phiên bàn SQL full, quý vị hãy tìm lại và chạy file cài. Nếu sử dụng phiên bản SQL Express, quý vị hãy tải 1 trong 2 file sau:

http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=1842

(Cho bản SQL 2008 Express)

http://www.microsoft.com/en-us/download/details.aspx?id=25174

(Cho bản SQL 2008 Express R2)

Quý vị chạy file exe vừa tải về, đừng tiếp tục cài đặt mà làm các bước sau

Bước 1:

Description: C:UsersHoangDesktopadd.JPG

Mở Program and Feature.

Chọn bản SQL Server trong máy, bấm Uninstall/Change.

Bấm Add để cài thêm chức năng, chỉ đường dẫn tới folder được extract khi chạy file exe

Bước 2:

Description: C:UsersHoangDesktopinstall.JPG

Description: C:UsersHoangDesktopsave.JPG

Bước 3: Chọn Add feature to existing instance

Description: C:UsersHoangDesktopsearch.JPG

Bước 4: Chọn chức năng Full-text Search, ấn Next để tiếp tục

Bước 5: Sau khi cài đặt, kiểm tra SQL và chạy thử query, nếu thấy kết quả 1 là OK.

Description: C:UsersHoangDesktopafter.JPG

Description: C:UsersHoangDesktopafter2.JPG

Đến đây, quý vị đã hoàn thành phần đầu của bài hướng dẫn.

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 quý vị  1 database sản phẩm với hơn 1000 entries. Quý vị vui lòng tải script database này tại đây

http://www.mediafire.com/view/srijhaz8090nj0g/fullTextDatabase.sql

Quý vị tải file script về và chạy, database chỉ có 1 bảng duy nhất là bảng Product

Chúng ta tiếp tục cài đặt full-text cho database

Bước 1: Tạo Full-text catalog

Quí vị vui lòng chọn Accent-insensitive

Kết quả sau khi tạo.

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 tôi sẽ 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, quý vị cẩn thận kẻo nhầm.

Bước 4: Quý vị check vào cột cần tạo index, tùy vào language của cột mà chọn (Tôi 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, quý vị 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 quý vị chọn Manually, bước này quý vị nên set thời gian để table populate full-text index.

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, quý vị 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.

(Một số framework như hibernate cũng hỗ trợ full text, tuy nhiên bài viết này không đề cập đến).

Thử nghiệm full-text query đã xong, chúng ta tiếp tục xây dựng ứng dụng đơn giản với chức năng Full-text search.

Xây dựng ứng dụng J2EE

Bước 1: Tạo 1 project web Java

Description: C:UsersHoangDesktopCreate.JPG

Bước 2: Add thư viện, cùng với config trong web.xml

Description: C:UsersHoangDesktopconfig.JPG

Bước 3: Thêm resource vào file context.xml

Description: C:UsersHoangDesktopconfig-context.JPG

Quý vị nhớ thay đổi port, username và password trong file context.xml theo máy quý vị

Chúng ta bắt đầu tạo DTO, DAO để đọc thông tin từ database

Quý vị nhớ tạo get,set cho các trường còn lại

Chúng ta tạo 2 hàm để so sánh giữa like và fulltext

Hàm GetProductByFullText tương tự, chỉ khác ở câu lệnh sql và truyền tham số

Chúng ta tạo khung search trong trang index.jsp

Tạo ProductServlet

Description: C:UsersHoangDesktopservlet.JPG

Trình bày kết quả lấy được trên trang index.jsp

Chương trình đã có thể chạy được, tuy nhiên quý vị nên bổ sung thêm đoạn css trên ở <head> để format sản phẩm dễ nhìn hơn.

Build & Deploy, ta có

Thử với tìm kiếm có dấu

Để cải tiến ở dụng, ta thay đổi câu query, những từ gần với keyword nhất sẽ được đưa lên trên cùng.

Thử tìm với từ khóa “xe dieu khien”, ta sẽ thấy rõ sự vượt trội của full-text index so với search thông thường. Những sản phẩm có chữ “xe điều khiển” nằm trên cùng, tiếp theo là sản phẩm có chữ “điều khiển”, “xe”,…

Chúc mừng quý vị đã hoàn thành bài tutorial. Full-text search là 1 chức năng rất hay mà ít người biết đến và sử dụng. Thông qua bài viết này, chúng tôi hi vọng quý vị có thể dễ dàng tích hợp full-text search vào ứng dụng, giúp tăng chất lượng sản phẩm.

Bài viết chỉ mới sử dụng 1 khía cạnh nhỏ chứ chưa thể bao quát hoàn toàn về full-text search. Quý vị 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

Cảm ơn quý vị đã theo dõi bài viết. Bài hướng dẫn hiện thực full-text search cho MySQL sẽ được trình bày trong các chủ đề sau bài viết này.