2012-03-04 3 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를 생성 . 단일 문서를 추가하기 위해 새 작성자를 열고 닫지 마십시오. 하나의 쿼리에 응답하기 위해 새 리더를 열지 말고 SearcherManager 또는 NRTManager를 대신 사용하십시오.

+0

그래서 IndeWriter에 대한 싱글 톤을 인스턴스화하고 그 때마다 다시 사용해야합니까? 닫지 않으면 쓰기가 색인에 저장되도록하려면 어떻게해야합니까? – user193116

+0

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

관련 문제