2008-12-29 67 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