以犧牲空間來換取時間的 sql full-text 具體的實現方案如下所示:
1:在Sql指令碼中完成full-text的建立【假設我將Users表中的LoginName欄位(nvarchar)與DisplayName欄位(nvarchar),Sites表中的Properties欄位(xml)加入到full-text檔案中】
--檢查資料庫MyDB是否支援全文索引,如果不支援--則使用sp_fulltext_database 開啟該功能if(select databaseproperty('MyDB','isfulltextenabled'))=0 execute sp_fulltext_database 'enable' --建立全文檢索目錄FT_MyDB(最後的參數e:/fulltext是自訂的儲存目錄,要是去掉將會在系統預設的地方建立相應的隱藏檔)execute sp_fulltext_catalog 'FT_MyDB','create','e:/fulltext'--建立唯一索引(這裡一定要先將系統預設為主鍵建立的聚簇索引刪除掉,因為一個表中只能有一個聚簇索引)create unique clustered index UsersId on dbo.Users(Id)create unique clustered index SitesId on dbo.Sites(Id) --為Users表和Sites表建立全文索引資料元execute sp_fulltext_table 'Users','create','FT_MyDB','UsersId'execute sp_fulltext_table 'Sites','create','FT_MyDB','SitesId'
--設定全文索引列名,(Users表的LoginName和DisplayName,Sites表的Properties)execute sp_fulltext_column 'Users','LoginName','add'execute sp_fulltext_column 'Users','DisplayName','add'execute sp_fulltext_column 'Sites','Properties','add' --建立全文索引--activate,是啟用表的全文檢索索引能力,也就是在全文檢索目錄中註冊該表execute sp_fulltext_table 'Users','activate'execute sp_fulltext_table 'Sites','activate' --填充全文索引目錄execute sp_fulltext_catalog 'FT_MyDB','start_full'go --檢查全文檢索目錄填充情況While fulltextcatalogproperty('FT_MyDB','populateStatus')<>0begin --如果全文檢索目錄正處於填充狀態,則等待30秒後再檢測一次waitfor delay '0:0:30'end
2:用相應的語句就可以對設定了全文索引的列進行filter,具體語句如下所示:
SELECT * FROM [MyDB].[dbo].[Users] WHERE CONTAINS(LoginName,'"ad*"') -–擷取nvarchar欄位LoginName中包含ad的記錄SELECT * FROM [MyDB].[dbo].[Sites] WHERE CONTAINS(Properties,'"haha"') –擷取xml欄位Properties中包含haha的記錄
3:由於sql full-text不能即時與資料庫的資料保持一致,因此要為資料表中的Full-Text Index運行相應的Incremental Population 或者 Full Population,這裡我們可以通過手動建立一個Schedule機制對其定期執行,使full-text中的資料與資料庫中的資料保持一致。
不過這裡也可以當我們去尋找資料的時候,可執行一下sql 語句來完成Incremental Population的運行,來確保每次搜素出來的資料都是最新的,sql語句如下所示:
execute sp_fulltext_catalog 'FT_My_DB','start_incremental'
但是上面的兩種方式都是我們自己去實現資料的同步,會損失一定的效率,我們可以用更好的一種方式:讓sql server自己去做資料的同步,sql指令碼如下所示:
USE DGA_DB;GOALTER FULLTEXT INDEX ON [My_DB].[dbo].[Users] SET CHANGE_TRACKING AUTO;GO
4:關於Sql Server的全文索引,我們可以參考MSDN來擷取更多的內容:
http://msdn.microsoft.com/zh-cn/library/ms142571