【问题标题】:MSSQL 2005 Fulltext search setupMSSQL 2005 全文搜索设置
【发布时间】:2008-12-29 17:38:53
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案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 子句以使事情正常进行。

    【讨论】:

    • 我想也许我正遭受过早优化的困扰,所以我想我会先用这样简单的东西来运行,看看它对我有什么好处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2010-10-11
    • 2011-04-02
    • 1970-01-01
    • 2012-03-18
    相关资源
    最近更新 更多