减少从全文查询返回的结果数

时间:2010-11-14 15:34:01

标签: sql-server full-text-search

我正在使用CONTAINS关键字搜索SQL-Server全文目录。 我正在查询的表包含(在其他列中)全文索引的文本列,以及表示添加行的日期(并且具有正常索引)的“added_date”列。

该表包含大约7M行。对全文目录的特定查询可能返回〜1M行。我希望使用“added_date”列来减少查询返回的行数。

问题在于,当我添加“added_date”条件时,我在执行计划中看到DB将对表进行两次查询:一次用于全文目录(在执行计划中称为“远程扫描”),并且一次为日期条件。这会强制数据库连接查询的两个部分的结果,因此不会实现性能提升。

是否有办法强制SQL Server仅对应用日期条件后剩余的行进行全文查询?

编辑:查询看起来像

SELECT reason, added_date FROM reasons_table WHERE CONTAINS(reason, 'a_reason') AND added_date > getdate()-5

1 个答案:

答案 0 :(得分:2)

正如你所指出的那样,你希望这种方式几乎是不可能的。根据您的情况的更大背景,您有一些选择。事实上,那篇文章给了你一些帮助。

以下是我阅读该文章时想到的一些想法:

  1. 在您的文字中嵌入过滤条件
    • 在文章中查看“考虑将过滤条件嵌入索引文本中的关键字”子弹。
    • 这基本上说你可以考虑将日期作为一个易于查找的字符串放在文本中。例如,“< DateAdded:YYYYMMDD>”在处理文本之前你可以删除的东西。
    • 对于范围可能不是很好,尽管这方面的解决方法是粗粒度过滤器术语。即,而不是DateAdded:YYYYMMDD,使用WeekAdded:YYYYWW,那么你可以从FTS中获得7-14天的价值,而你的added_date谓词可以进一步缩小它。
    • 可能在100个搜索字词之前停止实用。
    • 添加过滤条件意味着运行更新以将其添加到所有7m +记录
    • 否则,这似乎与
    • 之后的精神最为接近
  2. 两张桌子 - 水平分区
    • 如果您主要回顾几天,您可以尝试只使用FTS保留第二张表,只有最后 n 天的记录。
    • 可能是PITA维护。
  3. 两张桌子 - 垂直分区
    • 将您的表格拆分为1,其中包含您要在SQL中过滤的值以及另一个使用FTS文本过滤的值。然后使用CONTAINSTABLE将它们组合在一起。
    • 您仍在进行2次表格点击。但是,一个好处是减少的表格会更紧凑,每页记录更多,允许更少的IO。
    • 诚然,这种改善甚至可能都不明显。对于所有人来说,覆盖指数可能同样好。
  4. 和它一起生活
    • 你是否有性能数据表明这种双重读取会导致性能大幅下降?假设你的PK是< 10个字节,你的搜索字段有一个索引,我猜你需要返回20k +过滤的记录才能注意到额外的读取?
  5. 这些是否适用于您的特定情况?