您需要使用許多技術才能成功完成此項任務。
第一個,你需要某種持久層。如果您使用的是普通的舊網站,那麼用戶的會話將是最合乎邏輯的層次。如果您使用的是Web服務(意思是無會話),只是通過客戶端進行調用,那麼您仍然需要爲您的服務提供某種應用程序層(共享會話)。爲什麼?這一層將是您的數據庫結果緩存的所在。
第二個,您需要將結果緩存到您正在使用的任何容器(會話或Web服務的應用程序層)中。你可以通過幾種方法做到這一點......如果查詢是任何用戶都可以做的事情,那麼查詢的一個簡單的哈希將起作用,並且你可以在其他用戶中共享這個存儲的結果。您可能仍然需要某種結果的GUID,以便您可以在客戶端應用程序中傳遞這些GUID,但是從查詢到結果的散列查找將會很有用。如果這些查詢是唯一的,那麼您可以使用查詢結果的唯一GUID並將其傳遞給客戶端應用程序。這樣,您可以執行你的緩存功能...
緩存機制可以將某種固定長度的緩衝或排隊的......讓老的結果將被自動地清理/隨着新的添加刪除。然後,如果查詢進入緩存未命中,它將正常執行並添加到緩存中。
三,你會想一些方法來頁的結果對象...迭代器模式運作良好這裏,雖然可能更簡單的東西可能工作......像取出發點X量結果Y。然而,Iterator模式會更好,因爲如果您願意的話,稍後可以刪除您的緩存機制並直接從數據庫中進行翻頁。
第四個,您需要某種預取機制(如其他建議)。你應該啓動一個線程,將做全搜索,並在你的主線程只是做與頂級X數量項目的快速搜索。希望通過在用戶嘗試呼叫的時候,第二個線程將完成,並完整結果現在是在緩存中。如果結果沒有準備好,你可以加入一些簡單的加載屏幕邏輯。
這應該給你一些的方式...讓我知道,如果你想了解任何特定部分澄清/詳細信息。
我將離開你一些更多的技巧...
您不希望將整個結果發送到客戶端應用程序(如果您使用的是Ajax或類似iPhone的應用程序)。爲什麼?那是因爲這是一個巨大的浪費。用戶可能不會瀏覽所有結果......現在,您只需發送超過2MB的結果字段即可。
JavaScript是一種很棒的語言,但記住它仍然是一種客戶端腳本語言......您不希望通過向您的Ajax客戶端發送大量數據來處理太多的用戶體驗。只需將您的客戶端的預取結果和附加頁面結果作爲用戶頁面發送即可。
抽象抽象抽象...你想抽象出緩存,查詢,分頁,預取...儘可能多的。爲什麼?那麼可以說,你想要切換數據庫,或者你想直接從數據庫中進行分頁,而不是在緩存中使用結果對象......好吧,如果你這樣做了,那麼稍後更容易進行更改。另外,如果使用Web服務,許多其他應用程序稍後可以使用此邏輯。
現在,我可能提出了一個過度設計的解決方案,您需要:)。但是,如果您可以使用所有正確的技術來解決這個問題,那麼您將學到很多東西,並且有一個非常好的基礎,以便您可以擴展功能或重新使用此代碼。
如果您有任何疑問,請告知我。
你看過Apache SOLR嗎? – 2010-03-26 04:48:37