0

我开始涉足 MSSQL2005 的全文搜索。这是一个新的开发中数据库,所以我可以随意使用它。

假设我有一个“表单”表,它与其他两个表“答案”和“评论”具有一对多的关系。我希望用户能够输入一个搜索词,并通过全文搜索将所有这三个表挂起来。最好的方法是什么?似乎我可以创建一个索引视图来加快速度。

如果我确实使用索引视图(这是最好的路线吗?),我该如何处理一对多关系?假设我真正想弄清楚的是“表单”表的 ID,该表将包含在子答案/评论表中找到的任何搜索结果,因此我可以显示包含已定位条目的整个表单。视图上的内部连接会导致返回多个“主”表单行——这听起来对性能不太好。如何将所有子答案/评论行连接到视图的一个“列”中?所以代替....

Form 1, Answer A, Comment A 
Form 1, Answer B, Comment A 
Form 1, Answer A, Comment B 
Form 1, Answer B, Comment B

……会……

Form 1, Answer A Answer B, Comment A Comment B

请记住,我关心的只是那个主“表单”行的 ID。

这对我来说似乎是合乎逻辑的,但我还不确定全文搜索的最佳实践,所以只是好奇我是否正确地接近它。

更新:看起来索引视图非常严格;没有左连接,没有子查询,所以我可能会沿着由触发器填充的汇总表的路径走下去,如果它不会太笨拙的话。

4

1 回答 1

1

在 SQL 中,您应该使用以下经验法则: - 从要检索的元素开始 - 添加过滤器以限制要检索的元素集

这听起来很简单,但这确实是您所要做的。在这里,您需要表单元素(行),因此您编写:

SELECT ID
FROM Form

然后添加过滤器以将总集限制为您感兴趣的表单集。您可以使用 IN 谓词来执行此操作。正如您所说,Answer 和 Comment 与 Form 具有 1:n 的关系,这意味着 Answer 和 Comment 具有 Form.ID 的 FK。所以我们可以添加 where:

WHERE ID IN
(SELECT FormID FROM Answer WHERE CONTAINS(FullTextColumnInAnswer, @stringToSearch))
OR
ID IN
(SELECT FormID FROM Comment WHERE CONTAINS(FullTextColumnInComment, @stringToSearch))

这将导致一组不同的 Form.ID 值,这些值是至少有 1 个答案或评论的表单的 ID,其中包含要在启用全文搜索的字段中搜索的字符串。

在 SqlServer 2000 上,这可能比在 2005 上慢,因为您使用多个 CONTAINS 语句。

您也可以在连接场景中使用 CONTAINSTABLE() 代替,请参阅 BOL 示例,尽管我会先设置 IN 子句以使事情正常进行。

于 2008-12-30T09:30:57.277 回答