1

Web アプリケーションでは、アプリケーション全体にIndexReaderそれぞれ1 つと 1 つ持っています。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 に答える