2017-12-27 175 views
0

關於SearcherManager在IndexWriter中的用法,我有幾個基本問​​題。在SearchManager中使用IndexWriter

我需要定期在應用程序中重新構建Lucene索引,目前它發生在除提供搜索請求的線程以外的其他線程中。

  1. 我可以在應用程序的生命週期中使用相同的IndexWriter實例來定期重建索引嗎?目前,我在創業期間創建/打開一次,每當建立新索引時致電IndexWriter#commit
  2. 我正在使用SearcherManager來爲每個搜索請求獲取併發布IndexSearcher實例。在定期建立索引之後,我打算使用SearcherManager#maybeRefresh方法來刷新IndexSearcher實例.SearcherManager實例在啓動過程中也會創建一次,並且我打算徹底維護它。
  3. 在整個應用程序的整個生命週期中,我都沒有關閉IndexWriterSearcherManager

現在的問題,

  1. 如果我每一次我需要重建索引的時間創建一個新的IndexWriter,將SearcherManager#maybeRefresh能夠檢測到,這是一個新的IndexWriter實例?或者我需要使用新創建的IndexWriter創建一個新的SearcherManager?
  2. 什麼用IndexWriter創建SearcherManager例如,使用DirectoryReader或使用Directory創建它創造的區別吧?

回答

1

這些問題的答案取決於你如何構建你的SearcherManager

如果您有DirectoryReader,從SearcherManager獲得的所有未來IndexSearchers將根據該讀者構造它,即所有搜索將從實例化SearcherManager的時間點提供結果。如果您將數據寫入索引/目錄並在之後運行SearcherManager.maybeRefresh(),讀卡器將不會更新,並且您的搜索結果將過期。

如果構建SearcherManager時使用IndexWriterSearcherManager.maybeRefresh()將更新SearcherManager的閱讀器(如果數據已被寫入器寫入並提交)。所有新近收購的IndexSearchers將會反映潛在指數的新狀態。

儘管經驗有限,我推薦使用後一種方法。它提供了一個非常簡單的方法來實現near-real-time searching:在應用程序啓動時,您創建一個IndexWriter並用它構造一個SearcherManager。之後,您將開始一個後臺線程,該線程定期提交IndexWriter中的所有更改並刷新SearcherManager。對於應用程序的生命週期,您可以繼續使用初始的IndexWriter和SearcherManager,而無需關閉/重新打開它們。


PS:我纔開始使用Lucene工作前幾天,所以不要採取一切,我在這裏寫下的100%確定。

相關問題