1
在一個web應用程序中,我有一個IndexReader
和一個IndexSearcher
整個應用程序。您是否每次都需要IndexReader和IndexSearcher的新實例?
該文檔說他們是線程安全的,所以沒關係,但它是否應該正常工作,如果基礎索引更改(例如IndexWriter
進行更改)?
在一個web應用程序中,我有一個IndexReader
和一個IndexSearcher
整個應用程序。您是否每次都需要IndexReader和IndexSearcher的新實例?
該文檔說他們是線程安全的,所以沒關係,但它是否應該正常工作,如果基礎索引更改(例如IndexWriter
進行更改)?
是的,您需要重新打開閱讀器。
使用SearcherManager自動更新閱讀器,當您進行更改時調用maybeRefresh。
樣品下面的Scala代碼:
@volatile protected var LAST_SEARCHER_REFRESH = 0
protected lazy val SEARCHER_MANAGER = new SearcherManager (LUCENE_DIR, new SearcherFactory {
override def newSearcher (reader: IndexReader): IndexSearcher = {new IndexSearcher (reader)}
})
...
if (LAST_SEARCHER_REFRESH != Time.relativeSeconds()) {LAST_SEARCHER_REFRESH = Time.relativeSeconds(); SEARCHER_MANAGER.maybeRefresh()}
val searcher = SEARCHER_MANAGER.acquire(); try {
searcher.search (query, collector)
...
} finally {SEARCHER_MANAGER.release (searcher)}
有時候你必須雖然實現自己的緩存,像when you need to synchronize the IndexReader with TaxonomyReader。 IndexSearcher description有關於如何做到這一點的建議(通過DirectoryReader.open(IndexWriter, applyAllDeletes)有一條快速路徑可用於從用於提交更改的編寫器創建新讀取器)。