Index: IndexWriter.java =================================================================== --- IndexWriter.java (revision 429606) +++ IndexWriter.java (working copy) @@ -110,6 +110,7 @@ private SegmentInfos segmentInfos = new SegmentInfos(); // the segments private final Directory ramDirectory = new RAMDirectory(); // for temp segs + private int singleDocSegmentsCount = 0; // for speeding decision on merge candidates private Lock writeLock; private int termIndexInterval = DEFAULT_TERM_INDEX_INTERVAL; @@ -509,6 +510,7 @@ dw.addDocument(segmentName, doc); synchronized (this) { segmentInfos.addElement(new SegmentInfo(segmentName, 1, ramDirectory)); + singleDocSegmentsCount++; maybeMergeSegments(); } } @@ -694,8 +696,8 @@ long targetMergeDocs = minMergeDocs; while (targetMergeDocs <= maxMergeDocs) { // find segments smaller than current target size - int minSegment = segmentInfos.size(); - int mergeDocs = 0; + int minSegment = segmentInfos.size() - singleDocSegmentsCount; // top 1-doc segments are taken for sure + int mergeDocs = singleDocSegmentsCount; while (--minSegment >= 0) { SegmentInfo si = segmentInfos.info(minSegment); if (si.docCount >= targetMergeDocs) @@ -703,10 +705,12 @@ mergeDocs += si.docCount; } - if (mergeDocs >= targetMergeDocs) // found a merge to do + if (mergeDocs >= targetMergeDocs) { // found a merge to do mergeSegments(minSegment+1); - else + singleDocSegmentsCount = 0; + } else { break; + } targetMergeDocs *= mergeFactor; // increase target size }