[英]Strange behaviour with Fulltext search in SQL Server
我有带有列消息NVARCHAR(MAX)的MyTable。
ID为1的记录包含消息“ 0123456789333444测试”
当我运行以下查询
DECLARE @Keyword NVARCHAR(100)
SET @Keyword = '0123456789000001*'
SELECT *
FROM MyTable
WHERE CONTAINS(Message, @Keyword)
记录ID 1显示在结果中,我认为不应,因为0123456789333444不包含0123456789000001。
有人可以解释为什么仍然显示记录吗?
编辑
select * from sys.dm_fts_parser('"0123456789333444 Test"',1033,0,0)
返回以下内容:
group_id phrase_id occurrence special_term display_term expansion_type source_term
1 0 1 Exact Match 0123456789333444 0 0123456789333444 Test
1 0 1 Exact Match nn0123456789333444 0 0123456789333444 Test
1 0 2 Exact Match test 0 0123456789333444 Test
这是因为@Keyword没有用双引号引起来。 强制零个,一个或多个匹配。
指定以指定文本开头的单词或短语的匹配项。 将前缀术语用双引号(“”)括起来,并在结束引号之前添加星号( ),以便匹配所有以星号之前指定的简单术语开头的文本。 该子句的指定方式应为:CONTAINS(列,“文本 ”)。 星号匹配零个,一个或多个字符(词根或短语中的一个或多个根词)。 如果文本和星号没有用双引号引起来,则谓词为CONTAINS(列,“文本*”),则全文搜索会将星号视为字符,并搜索与文本*的完全匹配项。 全文引擎将找不到带星号(*)的单词,因为分词系统通常会忽略此类字符。
当是短语时,该短语中包含的每个单词都被视为一个单独的前缀。 因此,指定前缀术语“ local wine *”的查询将与文本为“ local winery”,“ local wined and dined”等的任何行匹配。
看一下有关该主题的MSDN。 MSDN
您是否尝试过查询以下视图以查看系统停止列表上的内容?
select * from sys.fulltext_system_stopwords where language_id = 1033;
找到了可行的解决方案。 我添加了language 1033
作为附加参数。
SELECT * FROM MyTable WHERE CONTAINS(Message, @Keyword, langauge 1033)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.