2014-05-10 2 views
0
IndexWriter writer = null; 
    try { 
     Directory dir = FSDirectory.open(new File(path)); 
     Analyzer analyzer = new StandardAnalyzer(LUCENE_VERSION); 
     IndexWriterConfig iwc = new IndexWriterConfig(LUCENE_VERSION, analyzer); 
     iwc.setRAMBufferSizeMB(getIndexRamBufferSizeMB()); 
     iwc.setOpenMode(OpenMode.CREATE_OR_APPEND); 
     writer = new IndexWriter(dir, iwc); 

     Term term = new Term(request.getIndexKeyName(), String.valueOf(request.getId())); 
     writer.deleteDocuments(term); 
     writer.deleteUnusedFiles();   
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    finally { 
     if (writer != null) { 
      try { 
       writer.commit(); 
       writer.close(true); 
      } catch (Exception e1) { 
       e1.printStackTrace(); 
      } 
     } 
    } 

문서를 삭제할 수 있지만 색인 파일 크기는 줄이지 ​​않습니다. 특히 _a.fdt, _a_Lucene41_0.pos.왜 삭제하지 않으면 lucene에서 색인 파일 크기가 줄어 듭니까?

모든 문서를 삭제 한 후 _a.fdt 크기 10037kb를 삭제하기 전에 크기가 동일합니다.

도와주세요.

+0

해결! ** writer.deleteUnusedFiles() ** 후에 ** writer.forceMergeDeletes() **를 사용하면 segments_c 및 segment_gen을 제외한 모든 파일이 삭제됩니다. 이 방법의 사용이 사실입니까? – hebset

답변

0

Lucene은 검색 속도에 최적화되어 있습니다.

삭제로 인해 해제 된 공간을 재생성하기 위해 파일을 다시 구성하려면 디스크 I/O가 필요합니다. 이는 RAM과 디스크의 파일을 비교할 때 상당히 비싼 작업입니다. 따라서 인덱스에서 파일을 삭제할 때 Lucene에게이 (비싼) 재구성 작업을 지시하지 않습니다.

공간을 확보하려면 기본적으로 디스크 공간을 비우는 expungeDeletes()을 사용하거나 좀 더 많은 노력을 기울이는 optimize()을 사용하면 검색 성능을 향상시킬 수 있습니다.

+0

이러한 방법을 사용할 수 없었습니다. lucene 버전은 이러한 방법을 지원하지 않기 때문에. 어쨌든 고마워. – hebset

0

영업 썼다 :

가 해결! writer.deleteUnusedFiles() 다음에 writer.forceMergeDeletes()을 사용하면 segments_csegment_gen을 제외한 모든 파일이 삭제됩니다.

+0

([댓글에 응답하고 커뮤니티 위키로 변환] (http://meta.stackoverflow.com/questions/251597/question-with-no-answers-but-issue-solved-in-the-comments).) –

관련 문제