2009-11-16 63 views
2

我正在尋找一些建議。我最近結束了一個項目,我繼承了一些可怕的代碼。我得到了應用程序的運行,但可以肯定地說有很多性能和設計問題,特別是高級搜索功能。現在我被要求做一個非常類似的項目,但規模要大得多。我有機會從頭開始構建一個更好的域模型,並創建一個更好的應用程序作爲一個整體。問題是實施高級搜索的最佳方式是什麼?高級搜索大型物體設計

高級搜索頁面會顯示一個包含兩個必需文本字段,4個可選下拉列表以及兩個帶多個可選複選框的獨立區域的表單,以便進一步過濾結果。

當前的解決方案使用兩個必填字段返回一個對象列表,然後根據任何可選的表單值進行過濾和刪除。然後我將過濾的List放入緩存並附加用戶的會話ID。然後在每個結果頁面上,我有一個Html.Helper,它顯示分頁鏈接,它使用從緩存中檢索的Take()。Skip()方法來顯示10個結果。

我遇到的問題是該列表可以變得非常健壯。我試圖通過將每個新頁面的結果放入緩存中來保存數據庫調用,但我不確定這是否是解決此問題的最佳方法。我應該把所有的表單值放在一個怪物查詢字符串中,並且繼續從GET請求中進行數據庫調用嗎?我應該將用戶搜索條件保存在數據庫或會話中,並將其用於每個新頁面的結果?我正確地使用緩存來保存這樣一個強壯的集合?

我問了一個類似於這裏的問題:Paging search results with asp.net MVC,這導致我使用緩存。現在我有了一個清晰的板岩,我很樂意遵循最佳做法,並從一開始就做好準備。任何建議都會很棒。

回答

1

顯然,實施高級搜索的最佳方式取決於您的要求和您當前對搜索空間大小和搜索頻率的估計。我的猜測是,你最大的問題是是否將搜索作爲ORM的一部分或關係數據庫來實現。

大型SQL查詢可能會非常慢,難以調整並且難以調試。如果高級搜索是一項重要功能並且有許多複雜的業務規則,那麼請考慮將搜索作爲您的ORM的一部分來實施。此外,智能搜索將有利於使用ORM。

將大量大對象加載到內存中可能會影響性能和可伸縮性。如果搜索空間很大,則考慮使用SQL來執行搜索。

有分佈式搜索算法可用,但它們非常複雜,您的預算,專業知識和交付時間表可能無法適應這種方法。高級搜索對項目的成功有多大戰略意義?

搜索必須是實時的嗎?如果不是,那麼就考慮一種混合方法,在非高峯時段對象被索引。不得不搜索低相關性詞語,例如「the」或「because」,這樣通過轉述的對象版本進行搜索可能會成爲愉快的媒介。

祝你好運,玩得開心!

+0

感謝您的想法。高級搜索部分是最重要且經常使用的功能,因此對整個項目而言具有極大的戰略意義。你非常重視讓SQL和ORM進行搜索和過濾......那麼我的設計是返回滿足兩個必填字段值的所有對象,然後根據可選的表單值在C#代碼中過濾該List是一種不好的做法? – 2009-11-16 23:53:33

+0

這聽起來像你想要在數據層中進行一些過濾並在Web層中進行一些過濾。是對的嗎?這可能是一個好方法。這聽起來不像是一個大的開發工作。你爲什麼不用這種方法?如果您稍後遇到問題,則始終可以用其他方式替換該代碼。嘗試模塊化代碼,以便插入替代品很容易。 – Glenn 2009-11-17 06:33:46

+0

很好的建議。至於爲這些搜索結果創建一個分頁系統,你會推薦將所有表單值放在一個怪物查詢字符串中,併爲每個分頁請求進行數據庫調用和過濾,或者是我的緩存系統是最佳實踐嗎? – 2009-11-17 06:50:57