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个字.
而且我知道单词(带变体*)得到了这么多匹配:
所以,如果我按顺序搜索:
@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)
我的查询速度有什么不同吗?
我运行了一些测试来监控实际执行计划的“查询成本”。
看起来,对于用“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为数据集中的流行词和后缀词。
| 归档时间: |
|
| 查看次数: |
427 次 |
| 最近记录: |