我掌握了sql server 2008开发人员版本,这是我的数据:
if exists (select * from dbo.sysobjects where id = object_id(N'test') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table test create table test ( Id INT IDENTITY NOT NULL primary key, data NVARCHAR(255) not null ) insert into test (data) values ('Hello world'); insert into test (data) values ('Hello j-world');
我想找到所有包含j-world的行,同时出于效率原因避免使用LIKE。
如果我尝试:
select * from test where freetext ( *, N'j-world' );
我得到所有不正确的行。我是否必须实现自己的断字器或其他工具?我真的可以在这种情况下使用iFTS吗?
谢谢。
基督教
PS:
让我更笼统地提出我的问题。如何使用FTS查找连字词(j-world仅是示例)?
我不太了解您为什么要使用FTS?如果您想要进行中,则只需使用LIKE即可完成:
SELECT * FROM test WHERE data like’%world%’
SELECT * FROM test WHERE data like’%j-world%’
如果您想玩FTS。 创建并参与自己的(自定义)全文非索引字表
在SSMS Databases \ YourDatabaseName \ Storage \ Full Text Stoplist中->右键单击并选择“ New Full-text StopList …”。我将其命名为 vgvStoplist ,并确保已选中默认的“创建空的syoplist”单选按钮。
在SSMS右键单击表dbo.test —>全文索引->属性—>选择页面:常规,全文索引Stoplist->输入创建的空列表的名称(我输入 vgvStoplist )
现在,查询
从包含以下内容的测试中选择*(数据,““ j-world””))
仅返回“ Hello j-world”(没有“ Hello world”)
这也可以通过TSQL完成。关注msdn
====更新: 嗯,您的问题表明噪声的概念是主观的。
之所以起作用,是因为’j’是系统停用词(请参见,它通过’j’(3个符号)字符串搜索系统停用列表(),另请参阅(*)),而’-‘显然是断字符器。
我不建议您使用空停用词列表。我只是通过最少的努力就说明了“如何做”。 制定适合您的技术完全取决于您。我什至不是这个领域的专家以提供建议。我只是根据常识来回答你的
创建您自己的全文StopList,并用您的内容填充它。 您可能要重用系统非索引字表内容。 为此,您可能需要创建
然后通过 使用查找和替换和/或从( ) 复制并粘贴( )的副本来创建自己的脚本。
(**)以下摘录自系统FT StopList的脚本副本,我将其命名为vgv_sys_copy:
ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'French'; ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Italian'; ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Japanese'; ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Dutch'; ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Russian'; ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Swedish'; ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Simplified Chinese'; ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'British English';
Update2 我在索引列上发布了子问题,即在LIKE上使用FTS进行FTS搜索,获得了子问题?
我还注意到我是根据SQL Server 2005中不可用的功能回答的, 应该有MSSQL \ FTData \ noiseENG.txt,我喜欢Sql Server 2005全文本搜索中“噪音词”的答案
我会删除“ j”。实际上,如果我是您,那么我将从头开始创建noiseENG.txt。但这是您的决定,具体取决于您的背景和我未知的多个因素。
我相信您应该将其作为单独的问题发布。我已经在StackExchange网站上被禁止了多次讨论(现在仍然在SF中)进行讨论。这不是论坛或讨论区,请参阅。常问问题。