【问题标题】:SQL Server Full Text Search not returning expected resultsSQL Server 全文搜索未返回预期结果
【发布时间】:2020-05-20 06:38:14
【问题描述】:

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

例如:

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

这是目录和索引图片:

【问题讨论】:

  • 如果没有结果,说明title列中没有包含'baycan'字样的行。
  • 但是我可以通过 LIKE 获取记录。所以不是这样
  • LIKECONTAINS 不是等效的运算符,所以仅仅因为 LIKE 返回某些东西并不意味着 CONTAINS 会。例如,值为 'abaycant' 的列 (title) 将为 WHERE title LIKE '%baycan%' 返回 true,但 CONTAINS(title,'baycan') 不会。
  • a 以及 FTS 中此查询的等效项 --- select * from tablename where title like '%baycan%';
  • 没有。 CONTAINS 不支持前导通配符。

标签: sql-server full-text-search


【解决方案1】:

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

CONTAINS 可以搜索:

  • 一个词或短语。
  • 单词或短语的前缀。
  • 一个词靠近另一个词。
  • 从另一个词屈折产生的词(例如,单词 drive 是drives、driven、driving 和driven 的屈折词干)。

一个词是另一个词的同义词,使用同义词库(例如 例如,“金属”这个词可以有“铝”等同义词和 “钢”)。

强调我自己的。

CONTAINS 不支持前导通配符,只支持尾随通配符。因此,(正如我在评论中所说)对于值为 'abaycant' 的列 (title),表达式 WHERE title LIKE '%baycan%' 将返回 TRUE,但 CONTAINS(title,'baycan') 不会。

如果你有'baycant' 的值,那么LIKE 'baycan%'CONTAINS(title,'baycan*')(和LIKE '%baycan%')都会返回TRUE;前 2 个也是 SARGable(括号中的那个不是)。

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

当使用它作为前缀时(在参数中没有用于后缀或“in中间"):

<prefix_term>

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

<prefix_term>是短语时,短语中包含的每个单词都是 被认为是一个单独的前缀。因此,一个查询指定一个 “local wine*”的前缀词匹配任何带有“local”文本的行 酒厂”、“在当地美酒佳肴”等等。

FREETEXT 不会改变这一点。 FREETEXT (Transact-SQL):

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

  • 根据单词边界将字符串分成单个单词(分词)。
  • 生成词的屈折形式(词干)。
  • 根据同义词库中的匹配项确定术语的扩展或替换列表。

再次强调我自己的。

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

【讨论】:

  • 这就是答案。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 2020-05-04
  • 2021-07-06
  • 1970-01-01
相关资源
最近更新 更多