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 个单词。
而且我知道单词(带有变体 *
)得到了这个匹配数:
- 公司 - 10k
- 姓名 - 5k
- 石油 - 2k
- 丙氨 - 1k
- 液体 - 500
- 1 行中的所有单词 - 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];
我的查询速度会有任何差异吗?
我 运行 一些测试监控 "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
设置为您数据中的流行词和落后词设置。
比如我得到了一个tableCompanies
。里面有一个字段FullName
,我在上面做了全文索引。然后我加入 table 和 CONTAINSTABLE
和 @search_word
就像 "company*" AND "name*" AND "oil*" AND "propan*" AND "liquid*"...
从 1 到 10 个单词。
而且我知道单词(带有变体 *
)得到了这个匹配数:
- 公司 - 10k
- 姓名 - 5k
- 石油 - 2k
- 丙氨 - 1k
- 液体 - 500
- 1 行中的所有单词 - 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];
我的查询速度会有任何差异吗?
我 运行 一些测试监控 "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
设置为您数据中的流行词和落后词设置。