gpt4 book ai didi

sql-server - CONTAINSTABLE 如何处理多个搜索词

转载 作者:行者123 更新时间:2023-12-02 23:24:51 26 4
gpt4 key购买 nike

例如,我有一个表Companies。其中有一个字段FullName,我在该字段上获得了全文索引。然后我用 CONTAINSTABLE@search_word 加入该表,例如 "company*"AND "name*"AND "oil*"AND "propan*"AND "liquid *"... 1 到 10 个单词。

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

  • 公司 - 10k
  • 姓名 - 5k
  • 油 - 2k
  • 丙烷 - 1k
  • 液体 - 500
  • 以上所有单词共 1 行 - 300 个匹配项

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

@search = '“公司*”AND“名称*”AND“油*”AND“丙烷*”AND“液体*”'

并按此顺序:

@search = '“液体*”AND“丙烷*”AND“油*”AND“名称*”AND“公司*”'

SELECT [FullName]
FROM dbo.Companies c
INNER JOIN CONTAINSTABLE (dbo.Companies, [FullName], @search) as s ON s.[KEY] = c.[KEY_FIELD];

我的查询速度会有什么差异吗?

最佳答案

我运行了一些测试来监控实际执行计划的“查询成本”。

对于使用“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;

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

关于sql-server - CONTAINSTABLE 如何处理多个搜索词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36054409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com