2012-03-04 57 views
0

我的用戶正在向我的應用程序提交文檔,該應用程序更新索引,其他用戶可以查詢該索引。與抓取工具不同,索引是間歇性的 - 只有在用戶提交文檔時纔會索引。我期望比索引寫入操作更多的索引搜索。 (我沒有使用Solr,因爲這對我的需求是一種矯枉過正),也沒有刪除或更新索引文檔。如何加快併發Lucene應用程序的速度?

這是我將代碼添加到索引和從索引讀取的代碼。我如何進一步優化它?

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

當一個搜索請求時,我創建了一個新IndexSearcher的如下

public IndexSearcher getIndexSearcher() throws CorruptIndexException, IOException { 

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

//然後我用這裏沒有顯示實際查詢搜索

回答

10

保持IndexWriters和周圍的IndexReader 。不要打開一個新的編寫器並關閉它只是爲了添加一個文檔。不要打開一個新的閱讀器來響應一個查詢,而是使用SearcherManager或NRTManager。

+0

那麼我應該爲IndeWriter實例化一個單例,並在每次寫入時重用它?如果我沒有關閉它,我怎麼確保寫入被保存到索引。 – user193116 2012-03-04 19:54:32

+0

@ user193116:http://blog.mikemccandless.com/2011/11/near-real-time-readers-with-lucenes.html – Xodarap 2012-03-04 23:07:48