MSSQL 2005全文搜索设置

时间:2008-12-29 17:38:53

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

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

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

如果我使用索引视图(这是最好的路径吗?),我该如何处理一对多关系?让我们假设我真正想要弄清楚的是“表单”表的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。

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

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

1 个答案:

答案 0 :(得分:1)

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

这听起来很简单,但它真的是你所要做的。在这里,你想要Form元素(行),所以你写:

SELECT ID
FROM Form

然后添加过滤器以将总设置限制为您感兴趣的表单集。您可以使用IN谓词来完成此操作。如你所说,答案和评论与表格有1:n的关系,这意味着答案和评论对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子句设置以使其工作正常。