例如我有一张表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*"'
)获得了这么多匹配:
所以,如果我按顺序搜索:
@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">
我的查询速度有什么不同吗?
答案 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
设置为数据集中的热门和后方字词。