全文搜索-包含加通配符和单引号



我有一个带有name字段的表

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*"' )

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

我检查了一些网站,关于逃离',但我没有发现任何提到这个..

Thanks in Advance

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

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

在搜索时,搜索引擎通常会忽略多词短语中的停止词。例如,搜索Contains(*, '"we x people"')将匹配文本...we the people..., xthe都是停止词,从而自动"匹配"彼此。(我使用"匹配"这个词是因为搜索引擎不匹配停止词,而是它知道peoplewe相差1个词。)

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

那么回到您的案例,Contains(*, '"Test O''neill 123"')将找到匹配,但通配符搜索Contains(*, '"Test O''neill 123*"')没有。(您甚至可以将搜索简化为Contains(*, '"O''neill*"'),您将看到它仍然没有找到匹配项。)停止词O与通配符的组合遇到了我在上一段中解释的问题。这就是你所提问题的关键。

解决方案从最有效到最无效,但可能更适合您的情况:

1)将全文索引上的语言更改为英语并重新索引。这将导致O'neill被视为一个单词,因此您将避免我解释的奇怪的通配符行为。您可以通过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'前缀。

最新更新