CONTAINSTABLE 如何处理许多搜索词

How CONTAINSTABLE works with many search words

比如我得到了一个tableCompanies。里面有一个字段FullName,我在上面做了全文索引。然后我加入 table 和 CONTAINSTABLE@search_word 就像 "company*" AND "name*" AND "oil*" AND "propan*" AND "liquid*"... 从 1 到 10 个单词。

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

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

@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];

我的查询速度会有任何差异吗?

我 运行 一些测试监控 "Query costs" 实际执行计划。

似乎 CONTAINSTABLE 的总成本在 "AND" 的搜索短语中加入的任意数量的单词等于 的成本最低 光是那些词就流行了。

CONTAINSTABLE 与 "OR" 连接的任意数量的单词的总成本等于 most 流行的成本仅这些词。

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

这是我的全文搜索测试:

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;

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