如果說索引是一本書的目錄,那全文索引就一本書的術語索引。舉例來說,我們想找出包含 web service 有哪幾頁 ?! 如果一頁一頁地找 ( 使用 Like '%web service%') ,搜尋的效率必定不好。
但是如果使用術語索引,如下所示, View, 370 Web service, 10, 65-68, 101 Wrappers, 114-115
很快就能找出與 web service 有關的有第 10, 65, 66, 67, 68 與
101 頁等。全文索引就像事先做好術語索引,表示哪個關鍵字可以在哪些記錄裡找到,甚至事先計算好 RANK ,全文檢索時不僅能夠大大提高查詢的速度,而且可以按照相關性來排序。
SQL Server 全文檢索的架構
首先我們必須了解 SQL Server 的資料是儲存在資料庫中,而全文索引是儲存在檔案系統中,稱為全文目錄,並使用 Microsoft Search Service 來維護與查詢全文索引,它是由 Gather, Index Engine 與 Search Engine 等所組成, 其中 Index Engine
負責維護與更新全文索引; Search Engine 處理全文檢索的搜尋查詢。 當您在 SQL Server 進行全文檢索時, Relational Engine 會將查詢命令 ( 包含 Contains 或 FreeText 等關鍵字 ) 轉拋給 Microsoft Search Service ,由 Search Engine 在全文目錄中搜尋符合條件的全文索引,然後 Gather 會提取這些全文檢索的資料列的識別加上等級值 (rank) ,並傳回給 SQL Server ,最後由 Relational Engine 根據這些訊息來產生查詢結果。
全文檢索的實作程序
在進行全文檢索之前,必須先使用一些系統預存程序來建立和擴展資料庫全文索引。
一、 建立全文索引
1. 啟用資料庫的全文檢索功能
use northwind
execute sp_fulltext_database 'enable'
2.
建立全文目錄
execute sp_fulltext_catalog 'ft1', 'create' 其中 ft1 為全文目錄名稱
3. 在全文目錄中註冊需要全文索引的資料表
execute sp_fulltext_table 'employees', 'create', 'ft1', 'PK_employees' 其中 PK_Employees 為 emplyess 的主索引鍵名稱
4. 指定資料表中需要全文檢索的資料行名稱 ( 欄位 )
execute sp_fulltext_column 'employees', 'notes', 'add', 0x0404 其中 0x0404 為 Chinese_Traditional 的地區設定識別碼,此與全文檢索的分詞演算法有關,以獲得更精確的搜尋。
二、 擴展全文索引目錄
當建立好全文索引之後,並無法立刻進行全文檢索,因為目前全文檢索是空的,您必須對全文索引進行擴展才會有值,這個過程稱為填入。 1. 建立資料表全文索引
execute sp_fulltext_table 'employees', 'activate'
2. 擴展全文目錄
SQL Server 全文檢索提供了完整擴展、增量擴展與重新建立等三種擴展方式。當您建立好全文索引後的第一件事就是執行完整擴展。
execute sp_fulltext_catalog 'ft1', 'start_full'
3. 啟用全文檢索的 變更 追蹤 全文索引不會隨之資料異動而同步更新,有別於一般索引。為了保持全文索引與資料同步,必須啟用全文檢索的 變更 追蹤。
execute sp_fulltext_catalog 'ft1', 'start_change_tracking'
三、 進行全文檢索
SQL Server 提供的全文檢索的保留字主要有 contains 和
freetext 。 contains 保留字用於在資料表的所有資料行或指定資料行中搜索一個單字或片語;一個單字或片語的字首等。 例如找出唸過 Boston 或 Concordia 大學的員工可以寫成 select * from employees where contains(notes, 'Boston' or 'Concordia*')
其中notes為欄位名稱,表在在指定的資料行中搜尋。 FreeText 保留字用於在資料表的所有列或指定列中搜索一個自由格式的文字。
例如找出 employees 資料表中包含 sales representative 員工資料 select * from employees where freetext(*, 'sales representative ') 其中 * 表示查詢所有資料行,查詢結果中會包含 sales, representative, representative salse 或 sales representative 等等文字的員工資料。一般來說使用 freetext 來進行全文檢索查詢比使用 contains 較為不精確。