2009-02-02 150 views
5

我已經使用Lucene.net在幾個小網站上實現了搜索功能(用於數據庫內容和上傳的文檔),沒有任何問題。現在我已經有一個網站在索引5000多個文檔(主要是PDF),查詢變得有點慢。緩存Lucene.net搜索結果

我假設加速它的最好方法是實現某種緩存。任何人都可以給我任何指針/例子從哪裏開始?如果除緩存之外還有其他建議(例如,我應該使用多個索引嗎?),我也想聽到這些建議。

編輯:

啞用戶錯誤負責緩慢查詢。我一次爲整個結果集創建高亮,而不僅僅是我顯示的「頁面」。哎呀。

回答

5

我打算在這裏做一個大的假設,並且假設你沒有掛在你的索引搜索器之間來查詢索引。

如果這是真的,那麼你應該肯定共享索引搜索所有查詢到你的索引。隨着指數變大(並且它不一定非常大以致成爲一個因素),重建索引搜索器將變得越來越成爲開銷。爲了使其正確工作,您需要同步對查詢解析器類的訪問(它不是線程安全的)。

順便說一句,Java文檔是(我發現),只適用於.net版本。

有關您的問題更多信息,請看這裏: http://wiki.apache.org/lucene-java/ImproveSearchingSpeed

+0

尼斯鏈接,謝謝 – Nick 2009-03-03 09:02:40

1

Lucene使用自己的內部「緩存」機制使索引檢索成爲一種快速操作。不過,我認爲緩存不是你的問題。

5000索引文檔聽起來微不足道,但這主要取決於您如何構建索引,索引/存儲的內容,查詢的方式(操作),文檔大小等。

請儘可能詳細地填寫有關索引的信息。

1

首先,Lucene的本身支持的內存版本的目錄:

Lucene.Net.Store.RAMDirectory 

你可以用它喜歡:

RAMDirectory idx = new RAMDirectory(); 

// Make an writer to create the index 
IndexWriter writer = 
    new IndexWriter(idx, new StandardAnalyzer(), true); 

如果這對你的作品,但它佔用了太多的內存,編寫一個包裝並將其作爲接口或Web服務公開。或者,如果您只是想緩存實體退出緩存時要查詢的內容,則可以在Lucene上編寫一個封裝器,以明顯地基於關鍵字爲您緩存最常見的結果。

我更喜歡前面提到的。使用RAMDirectory創建一個圍繞Lucene存儲的web服務或服務項目。這樣,如果索引很大,可以將Web服務卸載到具有大量內存的另一臺服務器上,並且具有近乎即時的結果。

1

一定要優化你的索引。此外,這是一個快速/簡單/有效的方式來實現緩存:HttpRuntime.Cache.Add(...);

您可以使用任何類型的項目/庫中的ASP.Net緩存。