> For the complete documentation index, see [llms.txt](https://learnsql.gitbook.io/lernmysql/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learnsql.gitbook.io/lernmysql/full-text-search/untitled-1.md).

# \[SQLSERVER] Hướng dẫn sử dụng chức năng tìm kiếm Full Text Search SQL SERVER 2016

{% file src="/files/-Lk50PhQK7zrSKpNw52j" %}
fullTextDatabase.sql
{% endfile %}

## \[SQLSERVER] Hướng dẫn sử dụng chức năng tìm kiếm Full Text Search SQL SERVER 2016

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.

## **Sử dụng tìm kiếm FULL-TEXT Search SQLSERVER**

**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.

![full text search trong sqlserver](https://laptrinhvb.net/uploads/baiviet/images/full_text_search_sqlserver.png)

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ụ:&#x20;

Ở 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:

```
SELECT SERVERPROPERTY('IsFullTextInstalled')
```

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

![full text sqlserver](https://laptrinhvb.net/uploads/baiviet/images/hinh1\(1\).jpg)

![full text catatlog](https://laptrinhvb.net/uploads/baiviet/images/hinh2.jpg)

Các bạn vui lòng chọn Accent-insensitive. Và dưới đây là kết quả

![full text  sqlserver](https://laptrinhvb.net/uploads/baiviet/images/hinh3\(1\).png)

**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.**

![full text sqlserver 2016](https://laptrinhvb.net/uploads/baiviet/images/hinh4.jpg)

**Bước 3:** Chọn bảng cần tạo full-text index, chọn define **full-text index**

![cài đặt full text sqlserver](https://laptrinhvb.net/uploads/baiviet/images/hinh5.png)

![su dung full text search](https://laptrinhvb.net/uploads/baiviet/images/hinh6.png)

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.

![full text](https://laptrinhvb.net/uploads/baiviet/images/hinh7.png)

**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)

![full text sql](https://laptrinhvb.net/uploads/baiviet/images/hinh8.png)

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.

![full text search](https://laptrinhvb.net/uploads/baiviet/images/hinh9.png)

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.

![full text](https://laptrinhvb.net/uploads/baiviet/images/hinh10.png)

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.

![ok full text sqlserver](https://laptrinhvb.net/uploads/baiviet/images/hinh11.png)

![index full text sqlserver](https://laptrinhvb.net/uploads/baiviet/images/hinh12.png)

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

![test full text search](https://laptrinhvb.net/uploads/baiviet/images/hinh13.jpg)

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

![test full text search sqlserver](https://laptrinhvb.net/uploads/baiviet/images/hinh14.jpg)

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\*”’

![kiem tra sqlserver full text search ](https://laptrinhvb.net/uploads/baiviet/images/hinh15.jpg)

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

![truy vấn full text search](https://laptrinhvb.net/uploads/baiviet/images/hinh16.jpg)

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”.

![full text](https://laptrinhvb.net/uploads/baiviet/images/hinh17.jpg)

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**

![free text](https://laptrinhvb.net/uploads/baiviet/images/hinh18.jpg)

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 :)
