1

在 Web 应用程序中,我有一个IndexReader和一个分别IndexSearcher用于整个应用程序。

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

4

1 回答 1

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)}

有时您必须实现自己的缓存,例如当您需要将 IndexReader 与 TaxonomyReader 同步时IndexSearcher 描述有关于如何做到这一点的建议(通过DirectoryReader.open(IndexWriter, applyAllDeletes)有一条快速路径,可以从用于提交更改的写入器创建新的读取器)。

于 2013-08-21T08:56:32.430 回答