小编典典

全文搜索sql server 2005

sql

我掌握了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仅是示例)?


阅读 148

收藏
2021-03-17

共1个答案

小编典典

我不太了解您为什么要使用FTS?如果您想要进行中,则只需使用LIKE即可完成:

  • SELECT * FROM test
    WHERE
    data like’%world%’

    • -导致
      --Hello world!
  • SELECT * FROM test
    WHERE
    data like’%j-world%’

    • -导致-
      您好j-world!

如果您想玩FTS。 创建并参与自己的(自定义)全文非索引字表

  • 我没有SQL Server 2005,但是我检查了它是否可以在2008年使用。
    文档告诉我们,仅兼容性级别100(即在SQL Server 2008中)是可能的。
    不过,在2005年尝试

在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中)进行讨论。这不是论坛或讨论区,请参阅。常问问题。

2021-03-17