从2.x版本就开始lucene默认采用的合并策略就已经是TieredMergePolicy了。所以今天有时间了解并看了一下TieredMergePolicy.findMerges方法的实现。
// 正在mergin的segmentinfo
Collection<SegmentCommitInfo> merging = writer.getMergingSegments();
Collection<SegmentCommitInfo> toBeMerged = new HashSet<>();
// 把SegmentCommitInfo放到集合中并且对其继续降序排序
List<SegmentCommitInfo> infosSorted = new ArrayList<>(infos.asList());
Collections.sort(infosSorted, new SegmentByteSizeDescending(writer));
接着把统计集合中的segments总大小(这个大小不包含删除),并且计算出最小的大小minSegmentBytes
long totIndexBytes = 0;
long minSegmentBytes = Long.MAX_VALUE;
for(SegmentCommitInfo info : infosSorted) {
final long segBytes = size(info, writer);
// 代码省略....
minSegmentBytes = Math.min(segBytes, minSegmentBytes);
// Accum total byte size
totIndexBytes += segBytes;
}
计算出集合中的总大小和最小的两个值之后,把超过maxMergedSegmentBytes/2.0大小的segment给排除掉,并且减去相应的大小(infosSorted已经排好序,由大到小,循环完之后会记录(tooBigCo