加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sqlserver2005全文索引与同义词操作目前发现的一些问题,及一个

发布时间:2020-12-12 15:47:20 所属栏目:MsSql教程 来源:网络整理
导读:完整代码如下: --显示版本信息 SELECT?@@VERSION; GO CREATE?TABLE?FullText_Test ( ??ID?int?IDENTITY(1,1), ??DATA?nvarchar(max),??--如果这里使用varchar(max),下面的插入也不带N,那CONTAINS得不到任何记录 ??CONSTRAINT?PK_ID_FullText_Test? ??????PRI
完整代码如下:
  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. ???
  14. INSERT?FullText_Test(DATA)
  15. ???VALUES(N'china');
  16. INSERT?FullText_Test(DATA)
  17. ???VALUES(N'中国');
  18. GO
  19. SELECT?*?FROM?FullText_Test;
  20. --建立全文目录
  21. CREATE?FULLTEXT?CATALOG?Test_CATALOG
  22. ??IN?PATH?N'D:/FT_MyTest'
  23. AS?DEFAULT;
  24. --建立全文索引
  25. CREATE?FULLTEXT?INDEX
  26. ??ON?FullText_Test(DATA?LANGUAGE?'Simplified?Chinese')
  27. KEY?INDEX?PK_ID_FullText_Test
  28. ??ON?Test_CATALOG
  29. WITH?CHANGE_TRACKING?AUTO;
  30. GO
  31. --延时5秒
  32. WAITFOR?DELAY?'00:00:05';
  33. PRINT?'----中华人民共和国-----'
  34. SELECT?*
  35. FROM?FullText_Test
  36. WHERE?CONTAINS(DATA,'中华人民共和国');
  37. PRINT?'----中国-----'
  38. SELECT?*
  39. FROM?FullText_Test
  40. WHERE?CONTAINS(DATA,'中国');
  41. /*查同义词,已将同义词文件tsCHS.xml添加如下节点:
  42. <expansion>
  43. ????<sub>中华人民共和国</sub>
  44. ????<sub>中国</sub>
  45. </expansion>
  46. */
  47. --此处查不到中华人民共和国的记录
  48. PRINT?'----同义词查询-----'
  49. SELECT?*
  50. FROM?FullText_Test
  51. WHERE?CONTAINS(DATA,'FORMSOF(THESAURUS,N''中国'')');
  52. /*
  53. 2???china
  54. 3???中国
  55. */
  56. --此处查不到中国的记录
  57. SELECT?*
  58. FROM?FullText_Test
  59. WHERE?CONTAINS(DATA,N''华夏'')');
  60. /*
  61. 2???china
  62. 3???中国
  63. */
  64. GO
  65. --删除测试
  66. DROP?FULLTEXT?INDEX?ON?FullText_Test;
  67. DROP?FULLTEXT?CATALOG?Test_CATALOG;
  68. DROP?TABLE?FullText_Test;
  69. GO
  70. /*
  71. --版本信息
  72. ------------------------------------
  73. Microsoft?SQL?Server?2005?-?9.00.1399.06?(Intel?X86)?
  74. ????Oct?14?2005?00:33:37?
  75. ????Copyright?(c)?1988-2005?Microsoft?Corporation
  76. ????Enterprise?Edition?on?Windows?NT?5.2?(Build?3790:?Service?Pack?2)
  77. ID??????????DATA
  78. -----------?-------------------------------
  79. 1???????????我爱中华人民共和国
  80. 2???????????我爱中国
  81. (2?行受影响)
  82. ----中华人民共和国-----
  83. ID??????????DATA
  84. -----------?-------------------------------
  85. 1???????????我爱中华人民共和国
  86. (1?行受影响)
  87. ----中国-----
  88. ID??????????DATA
  89. -----------?-------------------------------
  90. 2???????????我爱中国
  91. (1?行受影响)
  92. ----同义词查询-----
  93. ID??????????DATA
  94. -----------?-------------------------------
  95. 2???????????我爱中国
  96. (1?行受影响)
  97. ID??????????DATA
  98. -----------?--------------------------------
  99. 1???????????我爱中华人民共和国
  100. (1?行受影响)
  101. */

问题及说明如下:
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,N''中国'')');?
  11. --得到?
  12. china?
  13. ---在同义词库中又增加了"华夏"?
  14. --执行?
  15. SELECT?*?FROM?FullText_Test?WHERE?CONTAINS(DATA,N''中国'')');
  16. ?SELECT?*?FROM?FullText_Test?WHERE?CONTAINS(DATA,N''华夏'')');?
  17. --均得到?
  18. /*?china?*/?
  19. ---继续测试,看能否由中文同义词得到中文同义词?
  20. INSERT?FullText_Test(DATA)?VALUES(N'中国');?
  21. --当然,在这之后你要重新填充索引目录.?
  22. --除此之外,你还可以设置变更跟踪,这样就不用在数据记录变动后重新手工或者等时间让它重新填充了。数据负荷大的话,不推荐开启此设置。?
  23. SELECT?*?FROM?FullText_Test?WHERE?CONTAINS(DATA,N''中国'')');?
  24. /*?2?china?3?中国?*/?
  25. --此处查不到中国的记录?
  26. SELECT?*?FROM?FullText_Test?WHERE?CONTAINS(DATA,N''华夏'')');?
  27. /*?2?china?3?中国*/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读