全文搜索词大小写影响结果

Pan*_*ool 5 sql-server full-text-search sql-server-2008-r2

我在使用CONTAINS. 我将全文目录重音敏感设置设置为 false。

该表包含以下行:

Microsoft C#
Microsoft Visual C
Microsoft C
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下查询获取“Microsoft C#”时:

select name
from fulltexttable ft with (nolock)
where contains (
        ft.name
        ,N'microsoft and c#'
        )
Run Code Online (Sandbox Code Playgroud)

...它产生以下结果:

Microsoft Visual C
Microsoft C
Run Code Online (Sandbox Code Playgroud)

我尝试使用不同的外壳。它产生不同的结果集:

select *
from fulltexttable with (nolock)
where contains (
        name
        ,N'microsoft and C#'
        )
Run Code Online (Sandbox Code Playgroud)

结果:

Microsoft C#
Run Code Online (Sandbox Code Playgroud)

第二个是我所期望的。我以为 SQL Server 执行了不区分大小写的搜索来获取数据,但大小写似乎会影响全文结果?

wBo*_*Bob 8

尽管我在联机丛书中找不到参考资料,但已记录在案:

字符后跟非字母数字字符的规则有些复杂(至少在英语中是这样)。英文分词器接受标记 C# 并返回 C#。但是,小写标记 c# 被索引为 c,去掉了 # 字符。另一方面,大写标记 C++ 和小写标记 c++ 都被索引为 c++。

“SQL Server 2008 中的专业全文搜索” - Michael Coles, Hilary Cotter, p106

您可以使用 sys.dm_fts_parser DMV 检查您的搜索短语的行为,例如

SELECT * FROM sys.dm_fts_parser ( 'microsoft AND c#', 1033, 0, 0 )
SELECT * FROM sys.dm_fts_parser ( 'microsoft AND C#', 1033, 0, 0 )
Run Code Online (Sandbox Code Playgroud)

作为一种变通方法,您可以强制所有字符串以大写形式通过,对常见搜索词使用某种映射表,或设计一种策略以确保非字母数字字符永远不会作为全文索引的一部分存储或查询。

请注意,该行为在 SQL 2012 中更加一致(小写和大写都将仅返回“Microsoft C#”)。