SQL Server 2005 和 2008 R2 的英文分词器有哪些字符?

use*_*071 8 sql-server-2005 full-text-search sql-server-2008-r2

我可以通过使用找到哪些 DLL 支持英语分词,sp_help_fulltext_system_components但我无法找到英语分词字符的实际列表(如空白.%、 等)。

有人知道这个信息的来源吗?

Stu*_*ore 11

这不是官方列表,而是使用循环来处理字符列表,并sys.dm_fts_parser像这样使用:


declare @i integer
declare @cnt integer
set @i=0
while @i<255
begin
  set @cnt=0
  select @cnt=COUNT(1) FROM sys.dm_fts_parser ('"word1'+REPLACE(CHAR(@i),'"','""')+'word2"', 1033, 0, 0)
  if @cnt>1
    begin
      print 'this char - '+CASE WHEN @i > 31 THEN char(@i) ELSE '' END+' - char('+convert(varchar(3),@i)+') is a word breaker'
    end
  set @i=@i+1
end 
Run Code Online (Sandbox Code Playgroud)

我可以生成一个字符列表,sys.dm_fts_parser估计会破坏单词。(sys.dm_fts_parser为导入中找到的每个“单词”返回一行,因此如果它返回超过 1 行,我们有一个分词器)

这可以通过使用nchar()而不是char()(以及@i 的更大值)并在调用中更改参数 2 (lcid)来扩展到扩展/非英语字符集sys.dm_fts_parser


小智 5

SQL Server(任何版本)将任何非字母数字字符视为潜在的断字符。比意味着在某些情况下,服务器会以不同的方式(直接或扩展)处理预期会破坏单词的字符。

典型的断字符是点 ('.')

这些是点处理 (AICI) 的一些变体。

select display_term from sys.dm_fts_parser('"The great .NET."', 1033, 0, 0);
Run Code Online (Sandbox Code Playgroud)

返回“the”、“great”和“.net”

select display_term from sys.dm_fts_parser('"The great ASP.NET."', 1033, 0, 0);
Run Code Online (Sandbox Code Playgroud)

返回“the”、“great”、“asp.net”、“asp”和“net”

select display_term from sys.dm_fts_parser('"G.I.S."', 1033, 0, 0);
Run Code Online (Sandbox Code Playgroud)

返回“gis”和“gis”

select display_term from sys.dm_fts_parser('"3.14"', 1033, 0, 0);
Run Code Online (Sandbox Code Playgroud)

返回“3.14”和“nn3d14”

这不仅仅是点。

从 sys.dm_fts_parser('"数据驱动的应用程序"', 1033, 0, 0) 选择 display_term;

返回“数据驱动”、“数据”、“驱动”和“应用程序”

select display_term from sys.dm_fts_parser('"1-0"', 1033, 0, 0);
Run Code Online (Sandbox Code Playgroud)

返回“1-0”、“1”、“nn1”、“0”和“nn0”

select display_term from sys.dm_fts_parser('"c# j# f# a#"', 1033, 0, 0);
Run Code Online (Sandbox Code Playgroud)

返回“c#”、“j#”、“f”和“a”(通常缺少 f#)

select display_term, * from sys.dm_fts_parser('"c c+ c++"', 1033, 0, 0);
Run Code Online (Sandbox Code Playgroud)

返回“c”、“c”和“c++”

(潜在的)断词器列表(斯图尔特展示了在他的答案中得到它的方法)是简单的部分。困难的部分是获取正在使用的内部规则的列表;它们被处理/包含在位于 DRIVE:\Program Files\Microsoft SQL Server\INSTANCENAME\MSSQL\Binn 的 MSWB7*.dll、NaturalLanguage6.dll 和 NL7*.dll 中