2008-12-29 73 views
0

我开始进入全文搜索MSSQL2005。这是一个全新的开发中数据库,所以我可以随时使用它。MSSQL 2005全文搜索设置

假设我有一个“表格”表格,它与其他两个表格“答案”和“评论”具有一对多关系。我希望用户能够输入一个搜索词,并通过全文搜索将它们全部粘贴到这三个表中。最好的方法是什么?看起来好像我可以创建一个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

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

这听起来像一个没有脑子,但它的真的你只需要做。在这里,你希望表单元素(行),所以你写:

SELECT ID 
FROM Form 

,然后你添加过滤器来限制总集于一组的形式你感兴趣的您通过使用谓词做到这一点。正如你所说的答案和评论与表格有1:n的关系,这意味着答案和评论有一个FK Form.ID.所以我们可以在其中:

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该字段是全文搜索启用的。

由于您使用多个CONTAINS语句,所以在SqlServer 2000上这可能比2005年慢。

你也可以在连接场景中使用CONTAINSTABLE()来代替,请参阅BOL的例子,尽管我会先去IN子句设置来让事情工作。

+0

我想也许我正在遭受一种过早优化的情况,所以我想我会先用这样的简单事情来运行,然后看看我在哪里。 – Chris 2008-12-30 14:20:05