Class MergePolicy

    • Field Detail

      • DEFAULT_NO_CFS_RATIO

        protected static final double DEFAULT_NO_CFS_RATIO
        Default ratio for compound file system usage. Set to 1.0, always use compound file system.
        See Also:
        Constant Field Values
      • DEFAULT_MAX_CFS_SEGMENT_SIZE

        protected static final long DEFAULT_MAX_CFS_SEGMENT_SIZE
        Default max segment size in order to use compound file system. Set to Long.MAX_VALUE.
        See Also:
        Constant Field Values
      • noCFSRatio

        protected double noCFSRatio
        If the size of the merge segment exceeds this ratio of the total index size then it will remain in non-compound format
      • maxCFSSegmentSize

        protected long maxCFSSegmentSize
        If the size of the merged segment exceeds this value then it will not use compound file format.
    • Constructor Detail

      • MergePolicy

        public MergePolicy()
        Creates a new merge policy instance.
      • MergePolicy

        protected MergePolicy​(double defaultNoCFSRatio,
                              long defaultMaxCFSSegmentSize)
        Creates a new merge policy instance with default settings for noCFSRatio and maxCFSSegmentSize. This ctor should be used by subclasses using different defaults than the MergePolicy
    • Method Detail

      • findMerges

        public abstract MergePolicy.MergeSpecification findMerges​(MergeTrigger mergeTrigger,
                                                                  SegmentInfos segmentInfos,
                                                                  MergePolicy.MergeContext mergeContext)
                                                           throws 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:
        mergeTrigger - the event that triggered the merge
        segmentInfos - the total set of segments in the index
        mergeContext - the IndexWriter to find the merges on
        Throws:
        IOException
      • findForcedMerges

        public abstract MergePolicy.MergeSpecification findForcedMerges​(SegmentInfos segmentInfos,
                                                                        int maxSegmentCount,
                                                                        Map<SegmentCommitInfo,​Boolean> segmentsToMerge,
                                                                        MergePolicy.MergeContext mergeContext)
                                                                 throws 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.
        mergeContext - the MergeContext to find the merges on
        Throws:
        IOException
      • assertDelCount

        protected final boolean assertDelCount​(int delCount,
                                               SegmentCommitInfo info)
        Asserts that the delCount for this SegmentCommitInfo is valid
      • getNoCFSRatio

        public double getNoCFSRatio()
        Returns current noCFSRatio.
        See Also:
        setNoCFSRatio(double)
      • setNoCFSRatio

        public void setNoCFSRatio​(double noCFSRatio)
        If a merged segment will be more than this percentage of the total size of the index, leave the segment as non-compound file even if compound file is enabled. Set to 1.0 to always use CFS regardless of merge size.
      • getMaxCFSSegmentSizeMB

        public double getMaxCFSSegmentSizeMB()
        Returns the largest size allowed for a compound file segment
      • setMaxCFSSegmentSizeMB

        public void setMaxCFSSegmentSizeMB​(double v)
        If a merged segment will be more than this value, leave the segment as non-compound file even if compound file is enabled. Set this to Double.POSITIVE_INFINITY (default) and noCFSRatio to 1.0 to always use CFS regardless of merge size.
      • keepFullyDeletedSegment

        public boolean keepFullyDeletedSegment​(IOSupplier<CodecReader> readerIOSupplier)
                                        throws IOException
        Returns true if the segment represented by the given CodecReader should be keep even if it's fully deleted. This is useful for testing of for instance if the merge policy implements retention policies for soft deletes.
        Throws:
        IOException
      • numDeletesToMerge

        public int numDeletesToMerge​(SegmentCommitInfo info,
                                     int delCount,
                                     IOSupplier<CodecReader> readerSupplier)
                              throws IOException
        Returns the number of deletes that a merge would claim on the given segment. This method will by default return the sum of the del count on disk and the pending delete count. Yet, subclasses that wrap merge readers might modify this to reflect deletes that are carried over to the target segment in the case of soft deletes. Soft deletes all deletes to survive across merges in order to control when the soft-deleted data is claimed.
        Parameters:
        info - the segment info that identifies the segment
        delCount - the number deleted documents for this segment
        readerSupplier - a supplier that allows to obtain a CodecReader for this segment
        Throws:
        IOException
        See Also:
        IndexWriter.softUpdateDocument(Term, Iterable, Field...), IndexWriterConfig.setSoftDeletesField(String)