完整代码如下:
问题及说明如下:
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 格式非法。
绕开这些问题,我做了一个测试:
- --显示版本信息
- 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,'中国');
- /*查同义词,已将同义词文件tsCHS.xml添加如下节点:
- <expansion>
- <sub>中华人民共和国</sub>
- <sub>中国</sub>
- </expansion>
- */
- --此处查不到中华人民共和国的记录
- PRINT '----同义词查询-----'
- SELECT *
- FROM FullText_Test
- WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''中国'')');
- /*
- 2 china
- 3 中国
- */
- --此处查不到中国的记录
- SELECT *
- FROM FullText_Test
- WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''华夏'')');
- /*
- 2 china
- 3 中国
- */
- GO
- --删除测试
- DROP FULLTEXT INDEX ON FullText_Test;
- DROP FULLTEXT CATALOG Test_CATALOG;
- DROP TABLE FullText_Test;
- GO
- /*
- --版本信息
- ------------------------------------
- Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86)
- Oct 14 2005 00:33:37
- Copyright (c) 1988-2005 Microsoft Corporation
- Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
- ID DATA
- ----------- -------------------------------
- 1 我爱中华人民共和国
- 2 我爱中国
- (2 行受影响)
- ----中华人民共和国-----
- ID DATA
- ----------- -------------------------------
- 1 我爱中华人民共和国
- (1 行受影响)
- ----中国-----
- ID DATA
- ----------- -------------------------------
- 2 我爱中国
- (1 行受影响)
- ----同义词查询-----
- ID DATA
- ----------- -------------------------------
- 2 我爱中国
- (1 行受影响)
- ID DATA
- ----------- --------------------------------
- 1 我爱中华人民共和国
- (1 行受影响)
- */
问题及说明如下:
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''华夏'')');
- --均得到
- /* china */
- ---继续测试,看能否由中文同义词得到中文同义词
- INSERT FullText_Test(DATA) VALUES(N'中国');
- --当然,在这之后你要重新填充索引目录.
- --除此之外,你还可以设置变更跟踪,这样就不用在数据记录变动后重新手工或者等时间让它重新填充了。数据负荷大的话,不推荐开启此设置。
- SELECT * FROM FullText_Test WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''中国'')');
- /* 2 china 3 中国 */
- --此处查不到中国的记录
- SELECT * FROM FullText_Test WHERE CONTAINS(DATA,'FORMSOF(THESAURUS,N''华夏'')');
- /* 2 china 3 中国*/