7

我用MVC 2.0和Fluent NHibernate構建了一個ASP.NET MVC應用程序(由於某些原因隱藏在存儲庫後面)。該應用程序表示一個相當複雜的域,其中包含用戶,消息,評論,文件和約會等一些不同的對象。爲ASP.NET MVC應用程序實現全文搜索的最佳方式是什麼?

現在我想實現一個全文搜索,它使用戶能夠通過簡單地輸入一個搜索短語輕鬆地找到所有類型的內容。當單獨處理應用程序中的所有類型的不同對象時,我現在必須將它們放在一起進行搜索。這意味着用戶不區分不同的類型,他只是輸入「xyz」,並希望在列表中獲得結果,評論與消息等混合在一起。

選項1是創建一個搜索服務,用於獲取搜索來自不同的存儲庫並準備組合輸出(排序,分頁等)。但是,當背後的數據增長(並且會增長)時,這確實非常昂貴。

所以我正在尋找替代解決方案。目前我正在使用SQL Server 2008.我發現的是lucene.net(http://lucene.apache.org/lucene.net/),但我沒有花費太多時間。

有什麼建議嗎?

回答

2

我肯定會使用SQL全文功能。我明白,有些內容可能在文件,其他結構中可用,但即使如此,大部分數據應該位於後端,而SQL在全文索引體系結構方面做得很好。

我建議你從SQL全文開始,並創建一個查詢其他資源(如果需要)的小組件。我假設80%的可搜索內容將來自SQL Server。

這裏有一些資源,與SQL Server全文開始:

  1. http://msdn.microsoft.com/en-us/library/ms142571.aspx
  2. http://www.dotnetfunda.com/articles/article1019-implementing-fulltext-search-on-view-.aspx?sms_ss=dotnetshoutout
+0

甚至100%的數據來自SQL Server。所以你是對的,我只是採取古老的方式,甚至可以使用存儲過程或簡單的ADO.NET--幸好我仍然在使用存儲庫。 – 2010-09-29 18:11:22

2

對於.Net,您可以查看RavenDB,它使用lucene作爲索引存儲,並將爲您提供Lucene的搜索功能作爲獎勵。它可能更容易使用。當然更靈活和更好的API的imo。但是你應該考慮存儲開銷。

根據您的需要,您可以在SQL Server中啓用Full Text Search,該服務器爲您提供了來自SQL的其他查詢功能。這樣您就不需要管理數據庫數據之外的另一個索引。如果您的數據駐留在多個存儲庫中,那麼使用像Lucene這樣的外部索引可能是更好的方法。

至於其他全文搜索引擎,您有Microsoft Search Server Express,但您可能必須創建自己的內容連接器才能獲取數據(同樣取決於您的存儲庫)。

+0

@jfar:編輯我的回答來反映這一點。由於它提供的API,我仍然認爲直接使用RavenDB作爲Lucene的替代品是一個選擇。 – 2010-09-29 18:03:56

+0

更新了我的投票並刪除了評論以反映您的編輯;) – jfar 2010-09-29 18:07:06

0

簡單地說 「使用全文」 是不夠的。他的解決方案並不一定是在每個實體類型中進行更高級的文本搜索。他需要能夠根據查詢字符串查詢任何類型的實體的索引。我可以看到使用NHibernate.Search作爲填充Lucene索引的方法,但不知道它的功能是否支持搜索索引,而不考慮索引文檔類型(NHibernate類是否持久化)。因此,您可能需要更直接地查詢Lucene索引,並將結果解釋爲通過NHibernate本身顯示或直接檢索SQL服務器數據庫中的底層對象。