【问题标题】:Sql Server ContainsTable return zero result when try to select top records尝试选择顶级记录时,Sql Server ContainsTable 返回零结果
【发布时间】:2014-04-24 02:10:48
【问题描述】:

我们在 SQL Server 中实现了ContainsTable。问题是当我们按以下方式运行查询时

select DATAFILENAME 
from TableName
INNER JOIN CONTAINSTABLE (TableName, BOOLEANTEXT, '("xxxx" )  ') AS KEY_TBL ON DATAFILENAME = KEY_TBL.[KEY]  and CASETYPE like '%xxxx%'

这将返回大约 1200 条记录。

但我只想选择前1000,这里是如下查询

select DATAFILENAME 
from TableName
INNER JOIN CONTAINSTABLE (TableName, BOOLEANTEXT, '("xxxx",*1000* )  ') AS KEY_TBL ON DATAFILENAME = KEY_TBL.[KEY]  and CASETYPE like '%xxxx%'** 

此查询将返回零记录。

我已经重建全文索引,将跟踪更改为自动。但仍然显示零结果。

如果我遗漏了一些要点,请提出建议。在此先感谢

【问题讨论】:

  • 只使用 Limit 1000 有什么问题?还是选择前 1000 名?
  • 实际上我想将结果限制为前 1000。使用包含表,我添加了我想调用的记录的数量(1000),但当我从中删除数量(1000)时,它总是返回零containstable ,它显示结果,所以我真的不明白为什么会这样。

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


【解决方案1】:

您的两个查询是:

select DATAFILENAME
from TableName INNER JOIN
      CONTAINSTABLE(TableName, BOOLEANTEXT, '("xxxx" ) ')AS KEY_TBL
      ON DATAFILENAME = KEY_TBL.[KEY] and CASETYPE like '%xxxx%'

和:

select DATAFILENAME
from TableName INNER JOIN
      CONTAINSTABLE(TableName, BOOLEANTEXT, '("xxxx" ) ', 1000)AS KEY_TBL
      ON DATAFILENAME = KEY_TBL.[KEY] and CASETYPE like '%xxxx%'

第一个返回 1,200 条记录,第二个没有记录。

结论:CONTAINSTABLE 返回的前 1000 行在 TableName 中使用指定的条件没有匹配。

如果您只想要 1,000 行,请使用 top 1000

select top 1000 DATAFILENAME
from TableName INNER JOIN
      CONTAINSTABLE(TableName, BOOLEANTEXT, '("xxxx" ) ')AS KEY_TBL
      ON DATAFILENAME = KEY_TBL.[KEY] and CASETYPE like '%xxxx%'
order by KEY_TBL.rank desc;

注意order by KEY_TBL.rank,因此将首先返回最佳匹配行。

【讨论】:

  • 感谢您的回复。我同意您的逻辑,但我试图在 containstable 中获取结果。通过按照您的查询,结果将包含所有记录,然后选择前 1000 条。我的目标是直接从 containstable 中获取 1000 条记录。这将减少提取结果的时间。任何其他建议。谢谢
【解决方案2】:

您可以通过在查询中包含 top_n_by_rank 来获得此信息:

select DATAFILENAME 
from TableName
INNER JOIN CONTAINSTABLE (TableName, BOOLEANTEXT, '("xxxx" )  ', 1000) AS KEY_TBL 
    ON DATAFILENAME = KEY_TBL.[KEY]  
    and CASETYPE like '%xxxx%'

1000 术语将限制CONTAINSTABLE 结果。

n.b.如果 top_n_by_rank 与其他参数结合使用,则查询返回的行数可能少于实际匹配所有谓词的行数。 top_n_by_rank 允许您通过仅调用最相关的命中来提高查询性能。因此,根据结果的相关性,它可能返回少于 1000 条记录

【讨论】:

  • 当心!这与 Microsoft 所说的不完全一样: top_n_by_rank 指定仅返回 n 个最高排名的匹配项,按降序排列。仅在指定整数值 n 时适用。如果 top_n_by_rank 与其他参数结合使用,则查询返回的行数可能少于实际匹配所有谓词的行数。 top_n_by_rank 允许您通过仅调用最相关的命中来提高查询性能。因此,根据结果的相关性,它可能返回少于 1000 条记录
  • @Stéphan 这是一个很好的观点。我已经编辑了我的答案以反映潜在的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多