即使没有通配符,SQL Server全文搜索也会匹配单词的一部分

时间:2016-06-02 08:34:05

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

采取此查询:

SELECT * FROM Books
WHERE CONTAINS(([Description], ReverseDescription), '"øgle"')

这两列的文字正在搜索:

http://textuploader.com/5bg5r

http://textuploader.com/5bg59

为什么那个匹配?我不能在这两个文本中找到完全匹配。据我所知,如果我使用以下查询,则只显示部分匹配:

SELECT * FROM Books
WHERE CONTAINS(([Description], ReverseDescription), '"øgle*"')

任何人都知道发生了什么?

2 个答案:

答案 0 :(得分:2)

全文适用于选定的语言语法和词汇,而不是LIKE之类的简单字符比较。每种语言都定义stemmers and word breakers。我不能说天气øgle本身就是一个完整的单词,你的FT指数如何处理ø。我怀疑你的索引不是用丹麦语规则创建的。如果您的索引确实使用了正确的语言,那么您需要检查该语言使用的词干分析器和断路器规则。

更新

其实我认为更简单。 ""的存在使搜索字词成为前缀字词,没有*的事件。 MSDN在这里有点含糊不清,因为例如在Performing Prefix Searches中它指出:

  

当前缀术语是短语时,构成短语的每个标记都被视为单独的前缀术语。将返回包含以前缀术语开头的单词的所有行。例如,前缀术语"轻面包*"将找到文字为"光线包裹的行," "轻微面包屑,"或者"轻面包",但不会返回"轻微烤面包"。

请注意示例中的light如何是前缀,不需要light*。我没有要测试的系统,所以我的方面有点猜测,但我怀疑CONTAINS会将"øgle"视为不区分大小写的前缀搜索,然后您的文本包含两个匹配{ {1}}和Øgledronning

答案 1 :(得分:0)

更改 COLLATE Latin1_General_CS_AS

例如查询将看起来像

    SELECT * FROM Books
       WHERE CONTAINS(([Description], ReverseDescription), '"øgle*"')
     AND [Description] COLLATE Latin1_General_CS_AS LIKE '%"øgle*"%'