5

我有一个带有名称字段的表

Test O'neill 123

如果我使用

SELECT  *
    FROM    table F
    WHERE   CONTAINS ( F.*, '"Test O''neill 123"' )

它工作正常,但如果我使用通配符*,我不会得到任何结果。

SELECT  *
    FROM    table f
    WHERE   CONTAINS ( F.*, '"Test O''neill 123*"' )

为什么是这样 ?我正在为我的搜索词使用解析器,这是添加通配符*

我检查了一些网站,关于转义,'但我没有找到任何提到这个的..

提前致谢

4

1 回答 1

8

问题是由于 1) 使用中性语言 2) 加上全文索引的停止列表 3) 加上在包含停用词的搜索中使用通配符时出现的意外行为。

中性语言并未涵盖英语语言的所有细微差别,因此在索引时它认为O'neill是 2 个单独的单词Oneill. 然后你的停止列表认为O是一个停止词,所以这个“词”不会被添加到索引中,只是neill

在搜索时,搜索引擎通常会忽略多词短语中的停用词。例如,搜索Contains(*, '"we x people"')将匹配 text ...we the people...x并且the两者都是停用词,因此会自动“匹配”彼此。(我松散地使用“匹配”一词,因为搜索引擎不匹配停用词,而是知道它与 .people相距 1 个单词we。)

因此,您可能希望通配符搜索Contains(*, '"we the people*"')也能找到它的匹配项,但在使用 stoplist 时它不会。如果不是the搜索短语中的停用词,或者the不被视为停用词,则搜索将正常工作。我真的无法解释这种行为,但我怀疑它与计算单词位置的方式有关。我也怀疑这不是预期的行为。

所以回到你的情况,Contains(*, '"Test O''neill 123"')会找到匹配但通配符搜索Contains(*, '"Test O''neill 123*"')没有。(您甚至可以将搜索简化为Contains(*, '"O''neill*"'),您会发现它仍然找不到匹配项。)停用词O与通配符的组合遇到了我在上一段中解释的问题。这是您问题中所述问题的症结所在。

解决方案从最有效到最不有效但可能更实用的解决方案:

1)将全文索引上的语言更改为英语并重新索引。这将导致O'neill被视为 1 个单词,因此您将避免我解释的奇怪的通配符行为。您可以通过 SQL Server Management Studio 或通过删除并重新创建索引来更改全文索引属性中的语言,如下所示:

ALTER FULLTEXT INDEX ON MyTable DROP (Column1) 
GO
ALTER FULLTEXT INDEX ON MyTable ADD (Column1 LANGUAGE [English])
-- repeat for each column in the index

2) 如果您需要继续使用中性语言,请考虑O从停止列表中删除并重新索引。

ALTER FULLTEXT STOPLIST MyStoplist DROP 'o' LANGUAGE 'Neutral';

3)或者如果你不需要,不要使用停止列表。

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF

4)如果上述解决方案都不实用,请考虑从搜索短语中删除停用词,或者至少删除O'姓氏中的前缀。

于 2015-09-09T20:06:04.763 回答