在Sql Server資料庫中可以使用全文索引,與僅適用於字元模式的 LIKE 謂詞不同,全文檢索查詢將根據特定語言的規則對詞和短語進行操作,從而針對此資料執行語言搜尋。
對大量非結構化的文本資料進行查詢時,使用全文檢索搜尋獲得的效能優勢會得到充分的表現。對數百萬行文本資料執行的 LIKE 查詢可能需要花費幾分鐘時間才能返回結果;但對同樣的資料,全文檢索查詢只需要幾秒或更少的時間,具體取決於返回的行數。
可以對包含 char、varchar 和 nvarchar 資料的列建立全文索引。也可以對包含格式化位元據(如儲存在 varbinary(max) 或 image 列中的 Microsoft Word 文檔)的列建立全文索引。不能使用 LIKE 謂詞來查詢格式化的位元據。若要對一個表建立全文索引,該表必須具有一個唯一且非空的列。
下面是建立全文檢索索引的步驟
1、首先建立一個全文檢索目錄,一個全文檢索目錄可以包含多個全文索引,但一個全文索引只能用於構成一個全文檢索目錄。每個資料庫可以不包含全文檢索目錄或包含多個全文檢索目錄。as default參數表明把此全文檢索目錄作為預設的全文檢索目錄。
Create fulltext catalog DocumentCatalog as default
2、然後建立唯一非叢集索引。
create unique index T_DocumentsContent_VerID on T_DocumentsContent(VerID)
這個一般把你要全文索引的表上的主鍵作為唯一非叢集索引。該索引將強制插入列中的資料具有唯一性。一般都是主鍵符合這個要求。
3、最後一步就是建立全文索引
Create FULLTEXT INDEX ON T_DocumentsContent(DOCUCONTENT TYPE COLUMN ExtendedName)
key index T_DocumentsContent_VerID on DocumentCatalog
with change_tracking auto
T_DocumentsContent:用於全文索引的表明
DocuContent:用於全文檢索索引的欄位
如果用於全文檢索索引的欄位是二進位流檔案,那麼要通過指定這個二進位流檔案的副檔名由哪個列提供資料。如上例的Type Column ExtendedName,表明DocuContent的類型由ExtendedName列提供
key index用來指定全文索引表唯一鍵索引的名稱
on DocumentCatalog:表明這個全文索引是建立在哪個全文檢索目錄上
with Change_Tracking:指定 SQL Server 是否維護一份對索引資料的全部更改的列表。變更追蹤不會記錄通過 WRITETEXT 和 UPDATETEXT 進行的資料更改。他有幾個選項
1. MANUAL: 指定是使用 SQL Server Agent按計劃傳播變更追蹤日誌,還是由使用者手動進行傳播。
2.AUTO:指定在關聯的表中修改了資料時,SQL Server 自動更新全文索引。預設值為 AUTO。
3.OFF [ ,NO POPULATION] 指定 SQL Server 不保留對索引資料的更改的列表。僅當ANGE_TRACKING 為 OFF 時,才能使用 NO POPULATION 選項。如果指定了 NO POPULATION,則 SQL Server 在建立索引後不會對其進行填充。只有在使用者使用 START FULL 或 INCREMENTAL POPULATION 子句執行 ALTER FULLTEXT INDEX 命令後,才會索引頁預留空間。如果未指定 NO POPULATION,則 SQL Server 建立索引後將對其進行完全填充
當然如果需要使用全文索引需要把全文索引服務啟動,就是SQL Server FullText Search這個服務。注意Sql Express版本不能使用全文索引。
最後剩下如何進行全文檢索索引的查詢了。在查詢種我們不能使用like關鍵字來進行全文檢索索引,應該使用Contains謂詞,他的第一個參數是你要全文檢索索引的列名,可以指定多個列,用都好分割,並且必須用小括弧括起來,第二個參數是需要搜尋的文本,第二個參數前後必須用單引號包含起來,裡面查詢的文本可用引號包含,並且可以使用萬用字元和條件陳述式,如
where Contains(a.Content, '"中國*" or "武漢"')
條件陳述式可以用符號來代理如AND可以用&來代替,具體參看SQLServer的協助文檔。
第三個參數是查詢的語言。如果一個列裡面儲存了多種語言,允許使用者指定搜尋的語言。
除了Contains謂詞可以用於全文檢索索引FreeText也可以進行全文檢索索引,但次謂詞用於搜尋含有基於字元的資料類型的列,好像不能搜尋二進位流的列,但協助文檔卻又說支援Image的列。但是FreeText的搜尋精度沒有Contains的謂詞高,推薦使用Contains謂詞。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/firewolffeng/archive/2007/12/20/1956081.aspx