8

我有带有列消息 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
4

3 回答 3

1

这是因为 @Keyword 没有用双引号括起来。这会强制进行零个、一个或多个匹配。

指定以指定文本开头的单词或短语的匹配。将前缀术语括在双引号 ("") 中,并在结束引号之前添加星号 ( ),以便匹配以星号之前指定的简单术语开头的所有文本。该子句应以这种方式指定:CONTAINS (column, '"text "')。星号匹配零个、一个或多个字符(词根词或词或短语中的词)。如果文本和星号没有用双引号分隔,则谓词读取为 CONTAINS (column, 'text*'),全文搜索将星号视为字符并搜索与 text* 完全匹配的内容。

当是一个短语时,短语中包含的每个单词都被认为是一个单独的前缀。因此,指定前缀词“local wine*”的查询匹配任何带有“local winery”、“locally wined and dined”等文本的行。

查看有关该主题的 MSDN。 MSDN

于 2013-11-11T17:42:30.510 回答
1

您是否尝试查询以下视图以查看系统停止列表中的内容?

select * from sys.fulltext_system_stopwords where language_id = 1033;
于 2013-11-20T15:36:47.650 回答
1

找到了一个可行的解决方案。我已添加language 1033为附加参数。

SELECT * FROM MyTable WHERE CONTAINS(Message, @Keyword, langauge 1033) 
于 2014-01-13T10:19:41.553 回答