gpt4 book ai didi

sql-server-2008 - SQL Server 2008 - 换行符和全文查询

转载 作者:行者123 更新时间:2023-12-04 07:05:53 26 4
gpt4 key购买 nike

我有一个数据库和一个全文索引表。让我们称这个表为 test。该表有一个名为 testfield 的字段。现在,让我们只插入一条记录如下:

insert into test values ('word' + Char(13) + 'test')

此查询插入一个带有 LINE_BREAK 的单词。

现在,让我们使用全文查询此表:

select * from test where contains(testfield, '"word test"')

在那种情况下,这个查询什么都不返回。

还有:

select * from test where contains(testfield, '"wordtest"')

什么都不返回(这是预期的方式)

现在,让我们再次查询表,修改搜索词:

select * from test where contains(testfield, '"word' + Char(13) + 'test"')

在这种情况下,查询会返回正确的行。

问题是:为什么会这样?我的意思是,SQL 在搜索单词时应该忽略换行符,但事实并非如此。我不认为这是全文引擎的默认行为。至少是不能接受的。如果我的用户在我的表中插入带换行符的行(这很常见,因为他们可以写任何他们想写的东西,因为该字段是一个备注字段),会发生什么情况?

有什么办法可以纠正这个问题吗?

编辑

只有当我选择巴西语作为 FT 的语言时才会发生这种情况。如果我选择英语,我提到的问题都不会发生。

编辑

在 Sql Server Denali CTP3 上,英语和葡萄牙语都不起作用。也许这是英国蒸笼中的错误。

编辑

使用 fts_parser 的屏幕截图

最佳答案

尝试:

select * from test where contains(testfield, 'word NEAR test')

查看 CONTAINS documentation ,似乎您需要额外的邻近项才能找到 Char(13) 之后的匹配项。

编辑:如果使用邻近词还不够,请尝试将字符添加到“干扰词”列表中,以便在索引中忽略它。您可以在 $SQL_Server_Install_Path\Microsoft SQL Server\MSSQL.1\MSSQL\FTData 中找到干扰词文件。英文文件名为 noiseENG.txt。您可以在 Robert Sheldon's article about full-text indexing 中找到有关此详细信息的更多信息.

编辑: 我也在研究 CHAR(13) 和 NCHAR(13) 之间的区别,因为您可能会看到 unicode 与非 unicode 问题在您的原始测试中。

编辑:此外,在 2008 年,葡萄牙语有了新的 word breakers .断字符是特定于语言的,这可能是您看到这种差异的原因。它还matters为索引列选择了哪种语言。

编辑:要检查单词是如何被破坏的,请尝试运行它(如果您有权访问 master):

declare @english nvarchar(20), @portugese nvarchar(20)
set @english = N'"hello' + NCHAR(13) + N'world"'
set @portugese = N'"Olá' + NCHAR(13) + N'mundo"'

select * from sys.dm_fts_parser (@english, 1033, 0, 0)
select * from sys.dm_fts_parser (@portugese, 2070, 0, 0)

编辑:这会中断英语和葡萄牙语中的短语“hello[13]world”。下面是结果的屏幕截图,正如我所想的那样。 CHAR(13) 的处理方式略有不同。

Screenshot

关于sql-server-2008 - SQL Server 2008 - 换行符和全文查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7066496/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com