完整代碼如下:
- --顯示版本資訊
- SELECT @@VERSION;
- GO
- CREATE TABLE FullText_Test
- (
- ID int IDENTITY(1,1),
- DATA nvarchar(max), --如果這裡使用varchar(max),下面的插入也不帶N,那CONTAINS得不到任何記錄
- CONSTRAINT PK_ID_FullText_Test
- PRIMARY KEY(ID)
- );
- INSERT FullText_Test(DATA)
- VALUES(N'我愛中華人民共和國');
- INSERT FullText_Test(DATA)
- VALUES(N'china');
- INSERT FullText_Test(DATA)
- VALUES(N'中國');
- GO
- SELECT * FROM FullText_Test;
- --建立全文目錄
- CREATE FULLTEXT CATALOG Test_CATALOG
- IN PATH N'D:/FT_MyTest'
- AS DEFAULT;
- --建立全文索引
- CREATE FULLTEXT INDEX
- ON FullText_Test(DATA LANGUAGE 'Simplified Chinese')
- KEY INDEX PK_ID_FullText_Test
- ON Test_CATALOG
- WITH CHANGE_TRACKING AUTO;
- GO
- --延時5秒
- WAITFOR DELAY '00:00:05';
- PRINT '----中華人民共和國-----'
- SELECT *
- FROM FullText_Test
- WHERE CONTAINS(DATA,'中華人民共和國');
- PRINT '----中國-----'
- SELECT *
- FROM FullText_Test
- WHERE CONTAINS(DATA,'中國');
- --此處查不到中華人民共和國的記錄
- PRINT '----同義詞查詢-----'
- SELECT *
- FROM FullText_Test
- WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''中國'')');
- --此處查不到中國的記錄
- SELECT *
- FROM FullText_Test
- WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''華夏'')');
- GO
- --删除測試
- DROP FULLTEXT INDEX ON FullText_Test;
- DROP FULLTEXT CATALOG Test_CATALOG;
- DROP TABLE FullText_Test;
- GO
問題及說明如下:
1,我的2005目錄mssql.1的ftdata下無tschema.xml,則從
C:/Program Files/Common Files/System/MSSearch/Data/Config
拷貝一份到ftdata目錄下.
2,長期以來mssqlserver全文索引本來就是有問題的,比如一個完整的詞可能會搜不到,這來自中文分詞的技術問題,無法完美解決。
3,http://support.microsoft.com/kb/923317/zh-tw
依具此頁說明,當tsXXX.xml中含有一些字元時會封包件格式非法,這好像也是ms暫未解決的問題。
4,從msdn論壇得知,對于中文同義詞庫,可能存在同意詞之間的一些問題:
比如
兩個詞被定義為同義詞:形如: 中國人民 和 國人
或 我去爬山 和 爬山委員會
這樣的組可能會報 tsChs.xml 格式非法。
繞開這些問題,我做了一個測試:
- INSERT FullText_Test(DATA) VALUES(N'我愛中華人民共和國');
- INSERT FullText_Test(DATA) VALUES(N'china');
- 修改tsCHS.xml增加同義詞:
- <expansion>
- <sub>中國</sub>
- <sub>china</sub>
- </expansion>
- --在重新開機msftesql服務之後,填充全文目錄。
- --執行:
- SELECT * FROM FullText_Test WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''中國'')');
- --得到
- china
- ---在同義詞庫中又增加了"華夏"
- --執行
- SELECT * FROM FullText_Test WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''中國'')');
- SELECT * FROM FullText_Test WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''華夏'')');
- --均得到
- ---繼續測試,看能否由中文同義詞得到中文同義詞
- INSERT FullText_Test(DATA) VALUES(N'中國');
- --當然,在這之後你要重新填充索引目錄.
- --除此之外,你還可以設定變更跟蹤,這樣就不用在資料記錄變動後重新手工或者等時間讓它重新填充了。資料負荷大的話,不推薦開啟此設定。
- SELECT * FROM FullText_Test WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''中國'')');
- --此處查不到中國的記錄
- SELECT * FROM FullText_Test WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''華夏'')');