我安装了SQL Server全文搜索,创建了目录和索引。我确定数据库中有正确的记录,但是FTS函数不会返回任何结果。
例如:
select * from tablename where contains(title, 'baycan');
select * from tablename where contains(title, '"*baycan*"')
这是目录和索引图像:
答案 0 :(得分:3)
您似乎误解了CONTAINS
和LIKE
,它们是 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会为单词而不是字符建立索引。