Index: lucene/src/java/org/apache/lucene/index/TieredMergePolicy.java =================================================================== --- lucene/src/java/org/apache/lucene/index/TieredMergePolicy.java (revision 1136910) +++ lucene/src/java/org/apache/lucene/index/TieredMergePolicy.java (working copy) @@ -82,6 +82,7 @@ private double expungeDeletesPctAllowed = 10.0; private boolean useCompoundFile = true; private double noCFSRatio = 0.1; + private double reclaimDeletesWeight = 2.0; /** Maximum number of segments to be merged at a time * during "normal" merging. For explicit merging (eg, @@ -133,6 +134,23 @@ return maxMergedSegmentBytes/1024/1024.; } + /** Controls how aggressively merges that reclaim more + * deletions are favored. Higher values favor selecting + * merges that reclaim deletions. A value of 0.0 means + * deletions don't impact merge selection. */ + public TieredMergePolicy setReclaimDeletesWeight(double v) { + if (v < 0.0) { + throw new IllegalArgumentException("reclaimDeletesWeight must be >= 0.0 (got " + v + ")"); + } + reclaimDeletesWeight = v; + return this; + } + + /** See {@link #setReclaimDeletesWeight}. */ + public double getReclaimDeletesWeight() { + return reclaimDeletesWeight; + } + /** Segments smaller than this are "rounded up" to this * size, ie treated as equal (floor) size for merge * selection. This is to prevent frequent flushing of @@ -435,7 +453,7 @@ // Strongly favor merges that reclaim deletes: final double nonDelRatio = ((double) totAfterMergeBytes)/totBeforeMergeBytes; - mergeScore *= nonDelRatio; + mergeScore *= Math.pow(nonDelRatio, reclaimDeletesWeight); final double finalMergeScore = mergeScore; Index: lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java =================================================================== --- lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java (revision 1136910) +++ lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java (working copy) @@ -947,6 +947,7 @@ tmp.setSegmentsPerTier(_TestUtil.nextInt(r, 2, 20)); tmp.setUseCompoundFile(r.nextBoolean()); tmp.setNoCFSRatio(0.1 + r.nextDouble()*0.8); + tmp.setReclaimDeletesWeight(r.nextDouble()*4); return tmp; }