2012-03-04 36 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