2012-03-18 30 views
2

我想了解應該如何使用Lucene。Lucene NRTManager處理

從我看過的內容來看,創建一個IndexReader代價很高,所以使用Search Manager是正確的選擇。然而,SearchManager應由NRTManager(順便說一句,應該替換爲執行每個添加或刪除操作的IndexWriter)生成。但爲了有一個NRTManager,我應該首先有一個IndexWriter,這就是我的問題。

文檔說:

  • 的IndexWriter類是線程安全的
  • 這個類的構造函數需要一個Directory對象,因此它似乎創建instace應該是昂貴的(如在的IndexReader的情況下, )
  • 所有更改緩衝和定期刷新(所以他們似乎使用單一實例),以鼓勵

    但:

  • 的變化,但沖洗後commitclose

  • 纔可以看到完成製作後的更新(添加/刪除),實例應該關閉
  • 我也發現了這一點:Forgot to close the Lucene IndexWriter after adding Documents to the index它是說,不是關閉一個作家可能會毀了一切

那麼我真的該怎麼辦?有一個單一的IndexWriter實例是一個好主意(只製作commit而不是close它)?

更重要的是,如果我使用NRTManager,我該怎麼做一個commit?它甚至有可能嗎?

回答

2

blog article可能會幫助您瞭解如何使用NRTManager和SearcherManager。它解釋瞭如何在接近實時的情況下處理commitreopen

關於您的IndexWriter問題,是的,鼓勵使用單個IndexWriter,但您總是需要關閉IndexWriter。關閉一個IndexWriter類將執行幾件事情:

  • 等待當前的合併操作完成(可選),
  • 提交等待中的數據,
  • 刪除該目錄鎖定文件。

這就是爲什麼如果IndexWriter未關閉而文檔可能不可見,而索引仍存在未決更改。

在長時間運行的應用程序中,應用程序退出時應關閉IndexWriter(在桌面應用程序中,這可以在用戶關閉應用程序時完成,並且在web應用程序中可以使用destroy方法完成的一個servlet)。

+0

謝謝你,博客上的精彩文章。這讓我意識到,我不需要NRTManager(在我的情況下,它只是過分複雜的東西)。關於IndexWriter的結束,我會提供你的建議。 – Dragos 2012-03-19 21:36:00

相關問題