2012-03-04 70 views
4

我正在開發一個SQL Server 2008項目,我相信全文搜索是最好的方法。我一直在儘可能多地閱讀它,並且非常瞭解如何將它設置爲單個表格。但我不完全知道如何用我的方案設置它 - 想象一下如下表結構:SQL Server全文搜索 - 多對多關係

- Id 
- Title 
- Description 

BOOKAUTHOR

- BookId 
- AuthorId 

作者

- Id 
- Name 

正如您所看到的,數據庫包含一個帶有書籍的表格,每本書可以沒有,一個或多個作者。每位作者也可以是沒有,一本或多本書的一部分 - 即BookAuthor表具有多對多關係,可通過鏈接表BookAuthor處理。

我現在想要完成的是一個搜索工具,用於根據用戶提供的搜索字符串查找匹配的書籍。因此,如果在Brown用戶類型我希望找到的所有書籍,其中以下任一列中包含單詞Brown

Book.Title 
Book.Description 
Author.Name 

從本質上說,我希望有一個結果集的書籍,包括書的標題Brown Bear和作者Dan Brown所寫的書籍。如果有任何建議,我應該如何設置,我真的很感激你的意見!

(作爲一個側面說明,一旦我有這樣的過濾工作,查詢結果將還需要排序和分頁,通過@SortOrder@PageIndex@PageSize傳遞到存儲過程中處理 - 但我想這可能是一個)

+0

爲什麼您認爲全文搜索在這裏是一個體面的解決方案?這對我來說看起來像正常的數據庫設計。 – TomTom 2012-03-04 13:20:47

+0

[在多個表,列中使用SQL Server 2008中的全文搜索]可能的重複(http://stackoverflow.com/questions/403630/using-full-text-search-in-sql-server-2008-across -multiple-tables-columns) – 2012-03-04 14:01:19

+0

@TomTom如上所述搜索「Brown」只是我想獲得的簡單示例。我需要能夠搜索x個單詞,並且使用LIKE不起作用。我們還希望將來能夠找到_almost_匹配的行,並且這將需要全文搜索(據我所知)。 – Iskariot 2012-03-05 07:33:18

回答

2

CONTAINS謂詞可以將要搜索的列列表作爲其第一個參數;但是,這些列必須來自單個表格。你有幾個選擇來解決這個限制。一種選擇是,您可以執行兩個單獨的搜索,每個表上一個,然後將結果聯合在一起。

select Id, Title from Book where contains([Description], 'brown') 
union 
select b.Id, b.Title 
    from Book b inner join BookAuthor ba on b.Id = ba.BookId 
     inner join Author a on a.Id=ba.AuthorId 
    where contains([Name], 'brown') 

另一種選擇是採取的事實,即FTS indexes can be created on indexed views。爲此,請創建一個索引視圖,該視圖包含Book表中的Title字段和Author表中的Name字段,然後在視圖中的這兩列上創建一個FTS索引。然後,您可以按照以下方式針對此視圖撰寫查詢:

select BookId, Title from vw_BooksAndAuthors 
where contains(([Description], [Name]), 'brown') 
+0

謝謝你的建議喬! #1我一定會看到它會給出正確的結果 - 你有任何關於兩個查詢和工會性能打擊的想法嗎?假設一本書同時具有與搜索相匹配的描述和5個獨立的作者匹配 - 同一本書在與union聲明「合併」之前將被發現6次。 – Iskariot 2012-03-05 07:47:37

+0

對,兩個查詢和一個聯合的性能肯定會比單個查詢的性能更差。出於性能考慮,您可能需要考慮一些事項,但在您投入時間之前,您應該先確定性能將成爲應用程序中的問題,而不是浪費時間進行過早優化。如果您想要優化性能,可以定期運行一個作業,並將書籍和作者表的內容集合到一個非標準化表中,然後查詢單個非標準化表。 – 2012-03-05 15:24:36

+0

是的,我也在考慮這個選項,基本上有一個BookIndex表,它具有BookId和一個/許多額外的列,其中包含所有相關的可搜索信息,例如標題,描述每個作者的名稱聚合在一行上在那張桌子裏。然後全文索引那一個,並在搜索時將它加入Book-table。我想我會嘗試你的第一個建議與工會,但如果表現成爲一個問題,我會沿着這條路線。非常感謝您的意見! – Iskariot 2012-03-08 08:06:40