Index: IndexWriter.java =================================================================== --- IndexWriter.java (revision 432381) +++ IndexWriter.java (working copy) @@ -681,8 +681,8 @@ /** Merges all RAM-resident segments. */ private final void flushRamSegments() throws IOException { - int minSegment = segmentInfos.size()-1; - int docCount = 0; + int minSegment = segmentInfos.size()-singleDocSegmentsCount-1; + int docCount = singleDocSegmentsCount; while (minSegment >= 0 && (segmentInfos.info(minSegment)).dir == ramDirectory) { docCount += segmentInfos.info(minSegment).docCount; @@ -711,12 +711,10 @@ mergeDocs += si.docCount; } - if (mergeDocs >= targetMergeDocs) { // found a merge to do + if (mergeDocs >= targetMergeDocs) // found a merge to do mergeSegments(minSegment+1); - singleDocSegmentsCount = 0; - } else { + else break; - } targetMergeDocs *= mergeFactor; // increase target size } @@ -749,6 +747,11 @@ segmentsToDelete.addElement(reader); // queue segment for deletion } + // update 1-doc segments counter accordin to range of merged segments + if (singleDocSegmentsCount>0) { + singleDocSegmentsCount = Math.min(singleDocSegmentsCount, segmentInfos.size()-end); + } + int mergedDocCount = merger.merge(); if (infoStream != null) {