2012-03-04 6 views
0

ユーザーがドキュメントをアプリケーションに送信して、インデックスを更新し、他のユーザーがそのインデックスを照会できます。クローラとは異なり、索引付けは断続的です。ユーザーがドキュメントを送信するときにのみ索引付けされます。私はインデックスの書き込み操作よりも多くのインデックスの検索を期待しています。 (私はSolrを使用していません。なぜなら、これは私の必要性の過剰なものですから)インデックス付きドキュメントの削除や更新はありません。同時にLuceneアプリケーションを高速化する方法は?

これは、インデックスにドキュメントを追加し、インデックスから読むためのコードです。どうすればそれをさらに最適化できますか?

public IndexSearcher getIndexSearcher() throws CorruptIndexException, IOException { 

     IndexSearcher is= new IndexSearcher(IndexReader.open(directory, false)); 
     return is; 
    } 

を次のように

public void addDocument(Document doc) throws CorruptIndexException, LockObtainFailedException, IOException{ 

    IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)).setIndexDeletionPolicy(NoDeletionPolicy.INSTANCE).setRAMBufferSizeMB(256.0); 
    TieredMergePolicy tmp = new TieredMergePolicy(); 
    tmp.setUseCompoundFile(false); 
    tmp.setMaxMergedSegmentMB(1000000.0); 
    //tmp.setReclaimDeletesWeight(3.0); 
    //tmp.setMaxMergedSegmentMB(7000.0); 
    iwc.setMergePolicy(tmp); 
    // Make sure merges run @ higher prio than indexing: 
    final ConcurrentMergeScheduler cms = (ConcurrentMergeScheduler) iwc.getMergeScheduler(); 
    cms.setMergeThreadPriority(Thread.currentThread().getPriority() + 2); 
    cms.setMaxThreadCount(1); 
    cms.setMaxMergeCount(4); 



    IndexWriter iw = new IndexWriter(directory, iwc); 
    iw.addDocument(doc); 
    iw.close(); 
} 

検索要求が入ってくる

は、私はその後、

答えて

10

IndexWritersとIndexReaderを周りに保管してくださいここには示されていない実際のクエリの探索を使用する//新しいIndexSearcherを作成します。単一のドキュメントを追加するだけで新しいライターを開いて閉じないでください。 1つのクエリに応答するためだけに新しいリーダーを開かないでください。代わりにSearcherManagerまたはNRTManagerを使用してください。

+0

私はIndeWriterのためにシングルトンをインスタンス化する必要がありますか?もし私がそれを閉じなければ、どのようにして書き込みが確実にインデックスに保存されるのですか? – user193116

+0

@ user193116:http://blog.mikemccandless.com/2011/11/near-real-time-readers-with-lucenes.html – Xodarap

関連する問題