T-SQL FTS 包含单个字符“n”匹配数字
Posted
技术标签:
【中文标题】T-SQL FTS 包含单个字符“n”匹配数字【英文标题】:T-SQL FTS CONTAINS single character 'n' matches digits 【发布时间】:2018-11-11 08:33:30 【问题描述】:我正在使用 SQL Server 2016,遇到了一个非常奇怪的行为。
我有一个为 FTS 编制索引的表。
在像 ... CONTAINS(N'"a*"')
这样按单个字符搜索时,它会返回包含从 a
开始的单词的所有记录 - 好吧。
但是,如果我像 ... CONTAINS(N'"n*"')
这样按单个字符 n 进行搜索,它会返回 不仅 包含从 n
开始的单词的记录,而且还包含 digits。
我无法谷歌没有提到这种行为。我相信这是一种通配符,但文档中对此没有任何内容。
为什么会这样?有转义序列之类的吗?
UPD:测试环境
CREATE FULLTEXT CATALOG [ContentCatalog] WITH ACCENT_SENSITIVITY = ON
GO
CREATE TABLE [dbo].[Content]([id] [uniqueidentifier] NOT NULL, [content] [nvarchar](max) NOT NULL,
CONSTRAINT [PK_Content] PRIMARY KEY CLUSTERED ([id] ASC))
GO
ALTER TABLE [dbo].[Content] ADD CONSTRAINT [DF_Content_id] DEFAULT (newid()) FOR [id]
GO
INSERT [Content] ([content]) VALUES
(N'abc def nop'),
(N'zxc asd qwe'),
(N'zaq nhy bgt'),
(N'123 456 789'),
(N'z12 x34 c56')
GO
CREATE FULLTEXT INDEX ON [Content]([content] LANGUAGE 'English')
KEY INDEX [PK_Content]ON ([ContentCatalog], FILEGROUP [PRIMARY])
WITH (CHANGE_TRACKING = AUTO, STOPLIST = SYSTEM)
SELECT * FROM [dbo].[Content]
SELECT FULLTEXTSERVICEPROPERTY('IsFullTextInstalled') -- should be 1
SELECT * FROM [dbo].[Content] WHERE CONTAINS([Content], N'"a*"') -- returns 2 records
SELECT * FROM [dbo].[Content] WHERE CONTAINS([Content], N'"n*"') -- returns extra record with digits only
【问题讨论】:
您能否包含一个脚本来创建一个复制此环境供我们测试的环境?由于在我能找到的任何地方都没有提到这一点,我认为您的设置中还有其他原因导致了这种行为。 @iamdave 更新帖子 谢谢,不过您还需要编写全文索引和目录等。 @iamdave 已更新。 FTS 设置为默认设置 【参考方案1】:我知道这不是一个违反规则的答案,但我认为它添加了有用的附加信息,OP 可能希望将这些信息纳入他们的问题中。
有关更多信息,这似乎仅适用于 contains
中一定数量的 n
值。下面使用问题中的脚本来构建环境,但使用不同的测试值。 select
然后将包含返回的所有值整理到一行中以便于比较:
insert [content] ([content]) values
(N'abc nop abc'),
(N'abc nno abc'),
(N'abc nnn abc'),
(N'abc nnnnbc'),
(N'abc nnnnnc'),
(N'1 2 3'),
(N'10 11 12'),
(N'100 101 102'),
(N'1000 1001 1002'),
(N'10000 10001 10002')
go
select 'a*' as ContainsSearch, stuff((select ' || ' + content from [dbo].[content] where contains([content], N'"a*"') for xml path('')),1,4,'') as ReturnedValues
union all select 'n*' as ContainsSearch, stuff((select ' || ' + content from [dbo].[content] where contains([content], N'"n*"') for xml path('')),1,4,'') as ReturnedValues
union all select 'nn*' as ContainsSearch, stuff((select ' || ' + content from [dbo].[content] where contains([content], N'"nn*"') for xml path('')),1,4,'') as ReturnedValues
union all select 'nnn*' as ContainsSearch, stuff((select ' || ' + content from [dbo].[content] where contains([content], N'"nnn*"') for xml path('')),1,4,'') as ReturnedValues
union all select 'nnnn*' as ContainsSearch, stuff((select ' || ' + content from [dbo].[content] where contains([content], N'"nnnn*"') for xml path('')),1,4,'') as ReturnedValues
union all select 'nnnnn*' as ContainsSearch,stuff((select ' || ' + content from [dbo].[content] where contains([content], N'"nnnnn*"') for xml path('')),1,4,'') as ReturnedValues
结果:
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------+
| ContainsSearch | ReturnedValues |
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------+
| a* | abc nop abc || abc nno abc || abc nnn abc || abc nnnnbc || abc nnnnnc |
| n* | abc nop abc || abc nno abc || abc nnn abc || abc nnnnbc || abc nnnnnc || 10 11 12 || 100 101 102 || 1000 1001 1002 || 10000 10001 10002 |
| nn* | abc nno abc || abc nnn abc || abc nnnnbc || abc nnnnnc || 10 11 12 || 100 101 102 || 1000 1001 1002 || 10000 10001 10002 |
| nnn* | abc nnn abc || abc nnnnbc || abc nnnnnc |
| nnnn* | abc nnnnbc || abc nnnnnc |
| nnnnn* | abc nnnnnc |
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------+
【讨论】:
老实说,我不知道这里发生了什么,并且鉴于文档中缺少 anything 相关的内容,您很可能遇到了错误... 我做了错误报告feedback.azure.com/forums/908035-sql-server/suggestions/…以上是关于T-SQL FTS 包含单个字符“n”匹配数字的主要内容,如果未能解决你的问题,请参考以下文章