## org.apache.lucene.index
Class MergePolicy

    java.lang.Object
      org.apache.lucene.index.MergePolicy

All Implemented Interfaces:
  Closeable

Direct Known Subclasses:
  LogMergePolicy, MockRandomMergePolicy, NoMergePolicy, TieredMergePolicy, UpgradeIndexMergePolicy

    public abstract class MergePolicy

extends Object
implements Closeable

Expert: a MergePolicy determines the sequence of primitive merge operations.

Whenever the segments in an index have been altered by `IndexWriter`, either the addition of a newly flushed segment, addition of many segments from addIndexes* calls, or a previous merge that may now need to cascade, `IndexWriter` invokes `findMerges(org.apache.lucene.index.SegmentInfos)` to give the MergePolicy a chance to pick merges that are now required. This method returns a `MergePolicy.MergeSpecification` instance describing the set of merges that should be done, or null if no merges are necessary. When IndexWriter.forceMerge is called, it calls `findForcedMerges(SegmentInfos,int,Map)` and the MergePolicy should then return the necessary merges.

Note that the policy can return more than one merge at a time. In this case, if the writer is using `SerialMergeScheduler`, the merges will be run sequentially but if it is using `ConcurrentMergeScheduler` they will be run concurrently.

The default MergePolicy is `TieredMergePolicy`.

WARNING: This API is experimental and might change in incompatible ways in the next release.

Nested Class Summary
`static class` `MergePolicy.MergeAbortedException`
`static class` `MergePolicy.MergeException` Exception thrown if there are any problems while executing a merge.
`static class` `MergePolicy.MergeSpecification` A MergeSpecification instance provides the information necessary to perform multiple merges.
`static class` `MergePolicy.OneMerge` OneMerge provides the information necessary to perform an individual primitive merge operation, resulting in a single new segment.

Field Summary
`protected SetOnce<IndexWriter>` `writer`

Constructor Summary
`MergePolicy()` Creates a new merge policy instance.

Method Summary
`abstract void` `close()` Release all resources for the policy.
`abstract MergePolicy.MergeSpecification` `findForcedDeletesMerges(SegmentInfos segmentInfos)` Determine what set of merge operations is necessary in order to expunge all deletes from the index.
`abstract MergePolicy.MergeSpecification` `findForcedMerges(SegmentInfos segmentInfos, int maxSegmentCount, Map<SegmentInfo,Boolean> segmentsToMerge)` Determine what set of merge operations is necessary in order to merge to <= the specified segment count.
`abstract MergePolicy.MergeSpecification` `findMerges(SegmentInfos segmentInfos)` Determine what set of merge operations are now necessary on the index.
`void` `setIndexWriter(IndexWriter writer)` Sets the `IndexWriter` to use by this merge policy.
`abstract boolean` `useCompoundFile(SegmentInfos segments, SegmentInfo newSegment)` Returns true if a new segment (regardless of its origin) should use the compound file format.

Methods inherited from class java.lang.Object
`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

Field Detail

### writer

    protected final SetOnce<IndexWriter> writer

Constructor Detail

### MergePolicy

    public MergePolicy()

  Creates a new merge policy instance. Note that if you intend to use it without passing it to `IndexWriter`, you should call `setIndexWriter(IndexWriter)`.

Method Detail

### setIndexWriter

    public void setIndexWriter(IndexWriter writer)

  Sets the `IndexWriter` to use by this merge policy. This method is allowed to be called only once, and is usually set by IndexWriter. If it is called more than once, `SetOnce.AlreadySetException` is thrown.

  See Also:
    `SetOnce`

### findMerges

    public abstract MergePolicy.MergeSpecification findMerges(SegmentInfos segmentInfos)
                                                       throws CorruptIndexException,
                                                              IOException

  Determine what set of merge operations are now necessary on the index. `IndexWriter` calls this whenever there is a change to the segments. This call is always synchronized on the `IndexWriter` instance so only one thread at a time will call this method.

  Parameters:
    `segmentInfos` - the total set of segments in the index
  Throws:
    `CorruptIndexException`
    `IOException`

### findForcedMerges

    public abstract MergePolicy.MergeSpecification findForcedMerges(SegmentInfos segmentInfos,
                                                                    int maxSegmentCount,
                                                                    Map<SegmentInfo,Boolean> segmentsToMerge)
                                                             throws CorruptIndexException,
                                                                    IOException

  Determine what set of merge operations is necessary in order to merge to <= the specified segment count. `IndexWriter` calls this when its `IndexWriter.forceMerge(int)` method is called. This call is always synchronized on the `IndexWriter` instance so only one thread at a time will call this method.

  Parameters:
    `segmentInfos` - the total set of segments in the index
    `maxSegmentCount` - requested maximum number of segments in the index (currently this is always 1)
    `segmentsToMerge` - contains the specific SegmentInfo instances that must be merged away. This may be a subset of all SegmentInfos. If the value is True for a given SegmentInfo, that means this segment was an original segment present in the to-be-merged index; else, it was a segment produced by a cascaded merge.
  Throws:
    `CorruptIndexException`
    `IOException`

### findForcedDeletesMerges

    public abstract MergePolicy.MergeSpecification findForcedDeletesMerges(SegmentInfos segmentInfos)
                                                                    throws CorruptIndexException,
                                                                           IOException

  Determine what set of merge operations is necessary in order to expunge all deletes from the index.

  Parameters:
    `segmentInfos` - the total set of segments in the index
  Throws:
    `CorruptIndexException`
    `IOException`

### close

    public abstract void close()

  Release all resources for the policy.

  Specified by:
    `close` in interface `Closeable`

### useCompoundFile

    public abstract boolean useCompoundFile(SegmentInfos segments,
                                            SegmentInfo newSegment)
                                     throws IOException

  Returns true if a new segment (regardless of its origin) should use the compound file format.

  Throws:
    `IOException`