天天看點

sqlserver2005全文索引與同義詞操作目前發現的一些問題,及一個完整的測試

完整代碼如下:

  1. --顯示版本資訊
  2. SELECT @@VERSION;
  3. GO
  4. CREATE TABLE FullText_Test
  5. (
  6.   ID int IDENTITY(1,1),
  7.   DATA nvarchar(max),  --如果這裡使用varchar(max),下面的插入也不帶N,那CONTAINS得不到任何記錄
  8.   CONSTRAINT PK_ID_FullText_Test 
  9.       PRIMARY KEY(ID)
  10. );
  11. INSERT FullText_Test(DATA)
  12.    VALUES(N'我愛中華人民共和國');
  13. INSERT FullText_Test(DATA)
  14.    VALUES(N'china');
  15. INSERT FullText_Test(DATA)
  16.    VALUES(N'中國');
  17. GO
  18. SELECT * FROM FullText_Test;
  19. --建立全文目錄
  20. CREATE FULLTEXT CATALOG Test_CATALOG
  21.   IN PATH N'D:/FT_MyTest'
  22. AS DEFAULT;
  23. --建立全文索引
  24. CREATE FULLTEXT INDEX
  25.   ON FullText_Test(DATA LANGUAGE 'Simplified Chinese')
  26. KEY INDEX PK_ID_FullText_Test
  27.   ON Test_CATALOG
  28. WITH CHANGE_TRACKING AUTO;
  29. GO
  30. --延時5秒
  31. WAITFOR DELAY '00:00:05';
  32. PRINT '----中華人民共和國-----'
  33. SELECT *
  34. FROM FullText_Test
  35. WHERE CONTAINS(DATA,'中華人民共和國');
  36. PRINT '----中國-----'
  37. SELECT *
  38. FROM FullText_Test
  39. WHERE CONTAINS(DATA,'中國');
  40. --此處查不到中華人民共和國的記錄
  41. PRINT '----同義詞查詢-----'
  42. SELECT *
  43. FROM FullText_Test
  44. WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''中國'')');
  45. --此處查不到中國的記錄
  46. SELECT *
  47. FROM FullText_Test
  48. WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''華夏'')');
  49. GO
  50. --删除測試
  51. DROP FULLTEXT INDEX ON FullText_Test;
  52. DROP FULLTEXT CATALOG Test_CATALOG;
  53. DROP TABLE FullText_Test;
  54. 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 格式非法。

繞開這些問題,我做了一個測試:

  1. INSERT FullText_Test(DATA) VALUES(N'我愛中華人民共和國');
  2.  INSERT FullText_Test(DATA) VALUES(N'china'); 
  3. 修改tsCHS.xml增加同義詞: 
  4. <expansion>  
  5. <sub>中國</sub>  
  6. <sub>china</sub>  
  7. </expansion> 
  8. --在重新開機msftesql服務之後,填充全文目錄。 
  9. --執行: 
  10. SELECT * FROM FullText_Test WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''中國'')'); 
  11. --得到 
  12. china 
  13. ---在同義詞庫中又增加了"華夏" 
  14. --執行 
  15. SELECT * FROM FullText_Test WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''中國'')');
  16.  SELECT * FROM FullText_Test WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''華夏'')'); 
  17. --均得到 
  18. ---繼續測試,看能否由中文同義詞得到中文同義詞 
  19. INSERT FullText_Test(DATA) VALUES(N'中國'); 
  20. --當然,在這之後你要重新填充索引目錄. 
  21. --除此之外,你還可以設定變更跟蹤,這樣就不用在資料記錄變動後重新手工或者等時間讓它重新填充了。資料負荷大的話,不推薦開啟此設定。 
  22. SELECT * FROM FullText_Test WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''中國'')'); 
  23. --此處查不到中國的記錄 
  24. SELECT * FROM FullText_Test WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''華夏'')');