CONTAINSTABLE如何与许多搜索词一起使用

gof*_*fr1 5 sql-server full-text-search containstable

例如我有一张桌子Companies.其中有一个字段FullName,我有一个全文索引.然后,我加入一个表CONTAINSTABLE@search_word"company*" AND "name*" AND "oil*" AND "propan*" AND "liquid*"...从1到10个字.

而且我知道单词(带变体*)得到了这么多匹配:

  • 公司 - 10k
  • 名字 - 5k
  • 油 - 2k
  • propan - 1k
  • 液体 - 500
  • 以上所有单词排成一排 - 300场比赛

所以,如果我按顺序搜索:

@search = '"company*" AND "name*" AND "oil*" AND "propan*" AND "liquid*"'

并按此顺序:

@search = '"liquid*" AND "propan*" AND "oil*" AND "name*" AND "company*"'

SELECT [FullName]
FROM dbo.Companies c
INNER JOIN CONTAINSTABLE (dbo.Companies, [FullName], @search) as s ON s.[KEY] = c.[KEY_FIELD];
Run Code Online (Sandbox Code Playgroud)

我的查询速度有什么不同吗?

Y.B*_*.B. 1

我运行了一些测试来监控实际执行计划的“查询成本”。

看起来,对于用“AND”加入搜索短语中的任意数量的单词,CONTAINSTABLE 的总体成本等于这些单词中最不流行的单词的成本。

由“OR”连接的任意数量的单词的 CONTAINSTABLE 的总体成本等于这些单词中流行的单独单词的成本。

这表明全文搜索引擎根据索引中的流行度(出现次数)对搜索字符串中的单词进行优先级排序。因此,我认为尝试在客户端上预先订购搜索字符串单词不会有任何好处。

这是我的全文搜索测试:

Declare @Word1        nvarchar(50) = N'"Word1*"';
Declare @Word2        nvarchar(50) = N'"Word2*"';
Declare @SearchString nvarchar(100) = '';

PRINT SUBSTRING(CONVERT(varchar, SYSDATETIME(), 121), 12, 11) + ' Start';
Set @SearchString = @Word1;
Select * From CONTAINSTABLE([Table], [Field], @SearchString);
PRINT SUBSTRING(CONVERT(varchar, SYSDATETIME(), 121), 12, 11) + ' ' + @SearchString;
Set @SearchString = @Word2;
Select * From CONTAINSTABLE([Table], [Field], @SearchString);
PRINT SUBSTRING(CONVERT(varchar, SYSDATETIME(), 121), 12, 11) + ' ' + @SearchString;
Set @SearchString = @Word1 + ' AND ' + @Word2;
Select * From CONTAINSTABLE([Table], [Field], @SearchString);
PRINT SUBSTRING(CONVERT(varchar, SYSDATETIME(), 121), 12, 11) + ' ' + @SearchString;
Set @SearchString = @Word2 + ' AND ' + @Word1;
Select * From CONTAINSTABLE([Table], [Field], @SearchString);
PRINT SUBSTRING(CONVERT(varchar, SYSDATETIME(), 121), 12, 11) + ' ' + @SearchString;
Set @SearchString = @Word1 + ' OR ' + @Word2;
Select * From CONTAINSTABLE([Table], [Field], @SearchString);
PRINT SUBSTRING(CONVERT(varchar, SYSDATETIME(), 121), 12, 11) + ' ' + @SearchString;
Set @SearchString = @Word2 + ' OR ' + @Word1;
Select * From CONTAINSTABLE([Table], [Field], @SearchString);
PRINT SUBSTRING(CONVERT(varchar, SYSDATETIME(), 121), 12, 11) + ' ' + @SearchString;
Run Code Online (Sandbox Code Playgroud)

请替换[Table], [Field]为您实际的全文索引表和字段名称,并将@Word1和设置@Word2为数据集中的流行词和后缀词。