我的MyTable有一个列消息NVARCHAR(MAX)。
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
答案 0 :(得分:1)
这是因为@Keyword没有用双引号括起来。这会强制零,一个或多个匹配。
指定以...开头的单词或短语的匹配项 指定的文字。用双引号括起前缀术语 (“”)并在结束引号之前添加星号(),以便 所有文本都以星号前指定的简单术语开头 匹配。该条款应以这种方式指定:CONTAINS(列, ' “文本”')。星号匹配零个,一个或多个字符( 根词或单词或短语中的单词)。如果是文字和星号 不是由双引号分隔,所以谓词读取 CONTAINS(列,'text *'),全文搜索将星号视为 一个字符并搜索与文本*的完全匹配。全文 引擎将找不到带星号(*)字符的单词,因为 断字符通常会忽略这些字符。
短语是什么时候,短语中包含的每个单词都是 被认为是一个单独的前缀。因此,一个查询指定一个 “local wine *”的前缀术语匹配任何具有“local”文本的行 酒庄“,”在当地喝酒和用餐“,等等。
查看有关该主题的MSDN。 MSDN
答案 1 :(得分:1)
您是否尝试查询以下视图以查看系统停止列表中的内容?
select * from sys.fulltext_system_stopwords where language_id = 1033;
答案 2 :(得分:1)
找到一个有效的解决方案。我添加了language 1033
作为附加参数。
SELECT * FROM MyTable WHERE CONTAINS(Message, @Keyword, langauge 1033)