Tomcatでluceneを使う

java lucene
Tomcatでluceneを使う

バックグラウンド

次のコードは完全にスレッドセーフであると思います。

// Called from a servlet when a user action results in the index needing to be updated
public static void rebuildIndex() {
FSDirectory dir = new NIOFSDirectory(new File(Configuration.getAttachmentFolder()), null);
IndexWriter w = new IndexWriter(dir, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
.... build index ...
w.optimize();
w.commit();
w.close();
}

次のコードは検索サーブレットから呼び出されます。

// Called by the search servlet
public void search() {
FSDirectory dir = new NIOFSDirectory(new File(Configuration.getAttachmentFolder()), null);
IndexReader indexReader = IndexReader.open(dir,true);
IndexSearcher searcher = new IndexSearcher(indexReader);
.... do the search ...
}

質問

私はマルチスレッドの問題を避けるためにこれを実装するための最良の/正しい方法を考え出します。

  1. `FSDirectory dir`オブジェクトを何らかの静的として共有する必要があります
    変数?

  2. 「IndexSearcher searcher」または「IndexReader indexReader」
    オブジェクトは静的変数として保存され、インデックスが再構築されたときに単純に置き換えられますか?

  1  1


ベストアンサー

indexReaderとsearcherをrebuildIndex()の最後に移動し、もちろんrebuildIndex()とsearch()でsearcherを同期させるだけで済みます。 しかし、インデックスを再構築する頻度と検索結果を返す速度に基づいて、インデックスが再構築されるたびに待機する検索スレッドではなく、indexReaderとsearcherのキャッシュを検討する必要があります。

1


誰かが検索を実行するたびに新しいIndexSearcherとIndexReaderを開くことは非常に非効率的です。 search()へのすべての呼び出しで共有される単一のリーダーを持つのが最善です。 このリーダーインスタンスは閉じられ、インデックスを再構築する必要があるたびに置き換えられます。 もちろん、これは同期する必要があります。 これはもっと詳しく説明されています:

1


タイトルとURLをコピーしました