建立Catalog
現在您需要建立一個全文catalog。該目錄似乎是一個容器,把所有的全文索引到。因此,如果你要搜尋需要的三個表的文本,需要產生三個索引(每個表一個索引),並且把三個索引放在一個catalog中。
提示:在微軟網站涉及相關操作的一些資訊到需要SQL完整版本,如“Storage folder”就是Express版本沒有的。
別著急,下面大家來不通過管理介面手動建立一下catalog。Demo中,只建立了一個catalog,並把兩個full-text index放入其中。個人的一些經驗,如果一個index涉及的資料量較大,你應該為每一個index建立一個單獨的catalog。
下面操作是如何建立一個catalog:
- 程式—SQL SERVER管理介面—串連需要操作的資料庫
- 點擊 “New Query”
- 輸入:
use DBName go EXEC sp_fulltext_database ‘enable’ go CREATE FULLTEXT CATALOG catalogName go |
說明:DBName指要操作資料庫名稱;catalogName指catalog的名字,根據自己需要定義
- 執行上述SQL語句,將會做兩件事情,在相應資料庫上enable fulltext searching;建立全文檢索目錄
提示:如果目錄將會很大的話,把目錄放在其他硬碟或者地址會是一個明智的選擇。這樣會很大程度的提高效能。
建立全文索引
建立全文索引的一個前提是,表中必須有這樣的一個索引“unique, single-column, non-nullable index”。大多數情況下,主鍵都會滿足這樣的要求。
SQL Server這樣做的實際要求是:
1. 必須有非空索引(主鍵都會滿足這樣的要求)。
2. 索引必須作用在單獨一個列上。複合主鍵是不滿足這個要求,一個work around是可以建立立一列,如textid,int型,自增,並建立索引。
提示:如果你的主鍵過長,筆者也建議建立一個int型自增列,例如主鍵是GUID的話,那麼建立全文索引開銷會是非常巨大的。
建立全文索引步驟
- 保證上面提到的條件; unique, single-column, non-nullable index
- 輸入SQL 陳述式
CREATE FULLTEXT INDEX ON yourdatabase.dbo.yourtable ( column_to_index Language 0X0 ) KEY INDEX yourindex ON yourcatalog WITH CHANGE_TRACKING AUTO |
說明:
yourdatabase.dbo.yourtable: 使用者資料庫的名字和表明
column_to_index: 含有全文內容的列
yourindex:表裡的索引(就是上面描述需滿足unique, single-column, non-nullable index的索引)
yourcatalog: 本文開始時建立過的catalog名字
Language:告訴 SQL Server可以是任意語言(當然你也可以通過Management Studio修改成中文,英文等,具體語言編碼這裡不敖述)
提示:如果你的表資料量很大,建立全文索引會需要一定的時間,甚至會出現一段時間CPU使用率為100%的情況。
使用全文檢索索引
下面來使用一下,輸入SQL語句:
SELECT description
FROM yourtable
WHERE CONTAINS(description, '"NBA Playoff"') |
提示:
1. 字串的格式,最外面是單引號,裡面是雙引號,最裡面是要尋找的文本。
2. 想要模糊一把的話,請使用*, 如’”NBA*”‘會尋找所有以NBA開頭的文本。
3. 不支援開始模糊,筆者不才,’”*BA*”‘這樣是查不出東西的,大家如有辦法,歡迎指點
一些調試方法
- SQL Server Log: C:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/LOG
- FullText Index Log: SQLFTxxxxxx.LOG
提示:可讀性很差,但真正瞭解之後對Debug是很有協助的。
其他
1. SQL Server 2005之後,允許一個表擁有兩個及以上全文索引。
2. 尋找表中哪一列作為全文檢索索引列 select * from sys.fulltext_indexes
3. 如何添加一個全文索引
exec sp_fulltext_column
‘tabname’,
‘colname’, 'add', '2057'
說明:
tabname: 一段或兩段的表名。該表必須已經存在於當前的資料庫中。該表必須有全文索引。
colname: 是 qualified_table_name 中某個列的名稱。該列必須是一個字元,或是一個 image 列,不能是一個已計算資料行。
2057: 表示語言, code ‘2057′ 表示 UK English
地區設定 |
地區設定識別碼 |
中性 |
0 |
簡體中文 |
0×0804 |
繁體中文 |
0×0404 |
荷蘭語 |
0×0413 |
英國英語 |
0×0809 |
美國英語 |
0×0409 |
法語 |
0×040c |
德國 |
0×0407 |
意大利 |
0×0410 |
日語 |
0×0411 |
朝鮮語 |
0×0412 |
現代西班牙語 |
0×0c0a |
普通瑞典語 |
0×041d |
結論
全文檢索索引很容易建立,一旦建立,快速的響應將給使用者和使用者帶來驚喜!