在SQL Server中使用全文搜索的奇怪行为

时间:2013-11-11 16:30:02

标签: sql sql-server tsql full-text-search contains

我的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

3 个答案:

答案 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)