你每次都需要一个新的IndexReader和IndexSearcher实例吗?

时间:2013-08-21 00:37:36

标签: java lucene

在Web应用程序中,我为整个应用程序提供了一个IndexReader和一个IndexSearcher

文档说它们是线程安全的,所以没关系,但如果基础索引发生变化(例如IndexWriter进行了更改),它是否应该正常工作?

1 个答案:

答案 0 :(得分:3)

是的,您需要重新打开阅读器。

使用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 TaxonomyReaderIndexSearcher description提供了有关如何执行此操作的建议(通过DirectoryReader.open(IndexWriter, applyAllDeletes)快速路径,以便从用于提交更改的编写者创建新读者。)

相关问题