Web アプリケーションでは、アプリケーション全体にIndexReader
それぞれ1 つと 1 つ持っています。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)}
ただし、 IndexReader を TaxonomyReader と同期する必要がある場合など、独自のキャッシュを実装する必要がある場合があります。IndexSearcher の説明には、その方法に関する推奨事項があります(DirectoryReader.open(IndexWriter, applyAllDeletes)を介して、変更をコミットするために使用されるライターから新しいリーダーを作成する高速パスがあります)。