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

时间:2016-03-17 07:48:04

标签: sql-server full-text-search containstable

例如我有一张表Companies。其中有一个字段FullName,我在其中获得了全文索引。然后,我将CONTAINSTABLE@search_word "company*" AND "name*" AND "oil*" AND "propan*" AND "liquid*"...一样加入该表格,其中包含1到10个字的*

我知道单词(变体@search = '"company*" AND "name*" AND "oil*" AND "propan*" AND "liquid*"')获得了这么多匹配:

  • 公司 - 10k
  • name - 5k
  • 油 - 2k
  • propan - 1k
  • 液体 - 500
  • 上面所有单词中的1行 - 300场比赛

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

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

<button type="button" ng-click="removeNewRow($index)" ng-show="$first && !$last">

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

1 个答案:

答案 0 :(得分:1)

我运行了一些测试监控&#34;查询成本&#34;实际执行计划。

&#34;&#34; 在搜索词组中加入的任意数量的单词相比,CONTAINSTABLE的总体成本似乎等于 的成本这些话很受欢迎。

&#34; OR&#34; 相关联的任意数量的单词的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;

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