SQL Server全文本搜索未返回预期结果

时间:2020-02-04 12:19:52

标签: sql-server full-text-search

我安装了SQL Server全文搜索,创建了目录和索引。我确定数据库中有正确的记录,但是FTS函数不会返回任何结果。

例如:

select * from tablename where contains(title, 'baycan');
select * from tablename where contains(title, '"*baycan*"')

这是目录和索引图像:

enter image description here

1 个答案:

答案 0 :(得分:3)

您似乎误解了CONTAINSLIKE,它们是 not 等效运算符。来自CONTAINS (Transact-SQL)

CONTAINS可以搜索:

  • 单词或短语。
  • 单词或短语的前缀。
  • 一个词在另一个词附近。
  • 从另一个词衍生而来的词(例如,单词drive是驱动,驱动,驱动和从动的词干词素)。

与同义词库中的另一个单词同义的单词(用于 例如,单词“ metal”可以具有同义词,例如“ aluminum”和 “钢”)。

强调我自己。

CONTAINS不支持前导通配符,仅支持尾随通配符。结果,(如我在评论中所述)具有值title的列('abaycant')表达式WHERE title LIKE '%baycan%'将返回TRUE,但是CONTAINS(title,'baycan')不会返回TRUE。

如果您具有值'baycant',那么LIKE 'baycan%'CONTAINS(title,'baycan*')(以及LIKE '%baycan%')将全部返回TRUE;前2个也将是SARGable的(括号中的将不是)。

如果值是'best baycant',则CONTAINS(title,'baycan*')LIKE '%baycan%'都将返回TRUE,但是只有前者才是SARGable。

稍后将在与 phrase 参数(第二个参数)相关的参数部分中进一步支持此功能(使用第二个参数)作为前缀(后缀或“ in”的参数中没有选项)中间”):

<prefix_term>

指定以指定开头的单词或短语的匹配项 文本。将前缀术语括在双引号(“”)中,并添加一个 引号前的星号(*),以便所有文本 从星号之前指定的简单术语开始 匹配。该子句应通过以下方式指定:CONTAINS (column, '"text*"')。星号匹配零个,一个或多个字符( 字词或词组中的词根或词根)。如果文字和星号 没有用双引号分隔,因此谓词为 CONTAINS (column, 'text*'),全文本搜索将星号视为 一个字符并搜索与文本的完全匹配*。全文 引擎将找不到带星号(*)的单词,因为 分词系统通常会忽略此类字符。

<prefix_term> 是一个短语时,该短语中包含的每个单词都是 被认为是一个单独的前缀。因此,查询指定 “ local wine *”的前缀词与文本为“ local”的任何行匹配 酒厂”,“本地酿造并用餐”等等。

FREETEXT不会对此进行更改。 FREETEXT (Transact-SQL)

使用FREETEXT时,全文查询引擎在内部执行 在freetext_string上执行以下操作,为每个术语分配一个 权重,然后找到匹配项:

  • 基于单词边界(断字)将字符串分成单个单词。
  • 生成单词(词干)的变形形式。
  • 根据词库中的匹配项来标识术语的扩展或替换列表。

再次,强调我自己。

'abaycant'这样的值没有任何单词边界,因此FREETEXT(title, 'baycan')将不起作用。如果您需要前导通配符,则由于需要在单词中 进行搜索,则无法使用全文搜索,因为FTS会为单词而不是字符建立索引。