【问题标题】:Reducing number of results returned from Full-Text query减少从全文查询返回的结果数量
【发布时间】:2011-05-09 20:30:54
【问题描述】:

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

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

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

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

编辑:查询看起来像

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

【问题讨论】:

  • 请写下你使用的查询和索引。
  • 据此:technet.microsoft.com/en-us/library/cc917695.aspx 我试图实现的目标是不可能的:因为 MSFTESQL 服务在数据库引擎之外运行,SQL Server 2005 无法将 SQL 查询的谓词扩展到全文搜索.因此,即使您的查询可能具有显着减少查询返回的最终行数的附加条件,MSFTESQL 服务仍会返回目标搜索的所有匹配键。

标签: sql-server full-text-search


【解决方案1】:

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

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

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

这些对你的特殊情况有用吗?

【讨论】:

  • 实际上,技巧 #3 以及一些代码修改可以生成一个包含 FTS 测试的小得多的表,以后可以将其与原始表连接。我将尝试实施此解决方案,或对其他索引解决方案(例如 lucene)进行基准测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2013-08-24
相关资源
最近更新 更多