Example usage for org.apache.lucene.index SegmentInfos addAll

List of usage examples for org.apache.lucene.index SegmentInfos addAll

Introduction

In this page you can find the example usage for org.apache.lucene.index SegmentInfos addAll.

Prototype

public void addAll(Iterable<SegmentCommitInfo> sis) 

Source Link

Document

Appends the provided SegmentCommitInfo s.

Usage

From source file:cn.hbu.cs.esearch.core.EsearchMergePolicy.java

License:Apache License

/**
 * Finds merges necessary to expunge all deletes from the
 * index. The number of large segments will stay the same.
 *///w  ww  .java  2 s . co m
@Override
public MergeSpecification findForcedDeletesMerges(SegmentInfos infos)
        throws CorruptIndexException, IOException {
    final int numSegs = infos.size();
    final int numLargeSegs = (numSegs < _numLargeSegments ? numSegs : _numLargeSegments);
    MergeSpecification spec = null;

    if (numLargeSegs < numSegs) {
        List<SegmentInfoPerCommit> smallSegmentList = infos.asList().subList(numLargeSegs, numSegs);
        SegmentInfos smallSegments = new SegmentInfos();
        smallSegments.addAll(smallSegmentList);
        spec = super.findForcedDeletesMerges(smallSegments);
    }

    if (spec == null)
        spec = new MergeSpecification();
    for (int i = 0; i < numLargeSegs; i++) {
        SegmentInfoPerCommit info = infos.info(i);
        if (info.hasDeletions()) {
            spec.add(new OneMerge(infos.asList().subList(i, i + 1)));
        }
    }
    return spec;
}

From source file:cn.hbu.cs.esearch.core.EsearchMergePolicy.java

License:Apache License

/** Checks if any merges are now necessary and returns a
 *  {@link org.apache.lucene.index.MergePolicy.MergeSpecification} if so.
 *  This merge policy try to maintain {@link
 *  #setNumLargeSegments} of large segments in similar sizes.
 *  {@link org.apache.lucene.index.LogByteSizeMergePolicy} to small segments.
 *  Small segments are merged and promoted to a large segment
 *  when the total size reaches the average size of large segments.
 *//* w  w  w.  j  a v a 2 s .c om*/
@Override
public MergeSpecification findMerges(MergeTrigger mergeTrigger, SegmentInfos infos) throws IOException {
    final int numSegs = infos.size();
    final int numLargeSegs = _numLargeSegments;

    if (numSegs <= numLargeSegs)
        return null;

    long totalLargeSegSize = 0;
    long totalSmallSegSize = 0;
    SegmentInfoPerCommit info;

    // compute the total size of large segments
    for (int i = 0; i < numLargeSegs; i++) {
        info = infos.info(i);
        totalLargeSegSize += size(info);
    }
    // compute the total size of small segments
    for (int i = numLargeSegs; i < numSegs; i++) {
        info = infos.info(i);
        totalSmallSegSize += size(info);
    }

    long targetSegSize = (totalLargeSegSize / (numLargeSegs - 1));
    if (targetSegSize <= totalSmallSegSize) {
        // the total size of small segments is big enough,
        // promote the small segments to a large segment and do balanced merge,

        if (totalSmallSegSize < targetSegSize * 2) {
            MergeSpecification spec = findBalancedMerges(infos, numLargeSegs, (numLargeSegs - 1),
                    _partialExpunge);
            if (spec == null)
                spec = new MergeSpecification(); // should not happen
            spec.add(new OneMerge(infos.asList().subList(numLargeSegs, numSegs)));
            return spec;
        } else {
            return findBalancedMerges(infos, numSegs, numLargeSegs, _partialExpunge);
        }
    } else if (_maxSegments < numSegs) {
        // we have more than _maxSegments, merge small segments smaller than targetSegSize/4
        MergeSpecification spec = new MergeSpecification();
        int startSeg = numLargeSegs;
        long sizeThreshold = (targetSegSize / 4);
        while (startSeg < numSegs) {
            info = infos.info(startSeg);
            if (size(info) < sizeThreshold)
                break;
            startSeg++;
        }
        spec.add(new OneMerge(infos.asList().subList(startSeg, numSegs)));
        return spec;
    } else {
        // apply the log merge policy to small segments.
        List<SegmentInfoPerCommit> smallSegmentList = infos.asList().subList(numLargeSegs, numSegs);
        SegmentInfos smallSegments = new SegmentInfos();
        smallSegments.addAll(smallSegmentList);
        MergeSpecification spec = super.findMerges(mergeTrigger, smallSegments);

        if (_partialExpunge) {
            OneMerge expunge = findOneSegmentToExpunge(infos, numLargeSegs);
            if (expunge != null) {
                if (spec == null)
                    spec = new MergeSpecification();
                spec.add(expunge);
            }
        }
        return spec;
    }
}

From source file:proj.zoie.api.impl.ZoieMergePolicy.java

License:Apache License

/**
 * Finds merges necessary to expunge all deletes from the
 * index. The number of large segments will stay the same.
 */// w  ww . ja  va 2 s .c  o  m
@Override
public MergeSpecification findForcedDeletesMerges(SegmentInfos infos)
        throws CorruptIndexException, IOException {
    final int numSegs = infos.size();
    final int numLargeSegs = (numSegs < _numLargeSegments ? numSegs : _numLargeSegments);
    MergeSpecification spec = null;

    if (numLargeSegs < numSegs) {
        List<SegmentInfo> smallSegmentList = infos.asList().subList(numLargeSegs, numSegs);
        SegmentInfos smallSegments = new SegmentInfos();
        smallSegments.addAll(smallSegmentList);
        spec = super.findForcedDeletesMerges(smallSegments);
    }

    if (spec == null)
        spec = new MergeSpecification();
    for (int i = 0; i < numLargeSegs; i++) {
        SegmentInfo info = infos.info(i);
        if (info.hasDeletions()) {
            spec.add(new OneMerge(infos.asList().subList(i, i + 1)));
        }
    }
    return spec;
}

From source file:proj.zoie.api.impl.ZoieMergePolicy.java

License:Apache License

/** Checks if any merges are now necessary and returns a
 *  {@link MergePolicy.MergeSpecification} if so.
 *  This merge policy try to maintain {@link
 *  #setNumLargeSegments} of large segments in similar sizes.
 *  {@link LogByteSizeMergePolicy} to small segments.
 *  Small segments are merged and promoted to a large segment
 *  when the total size reaches the average size of large segments.
 *//* w  ww. ja v  a 2 s . com*/
@Override
public MergeSpecification findMerges(SegmentInfos infos) throws IOException {
    final int numSegs = infos.size();
    final int numLargeSegs = _numLargeSegments;

    if (numSegs <= numLargeSegs)
        return null;

    long totalLargeSegSize = 0;
    long totalSmallSegSize = 0;
    SegmentInfo info;

    // compute the total size of large segments
    for (int i = 0; i < numLargeSegs; i++) {
        info = infos.info(i);
        totalLargeSegSize += size(info);
    }
    // compute the total size of small segments
    for (int i = numLargeSegs; i < numSegs; i++) {
        info = infos.info(i);
        totalSmallSegSize += size(info);
    }

    long targetSegSize = (totalLargeSegSize / (numLargeSegs - 1));
    if (targetSegSize <= totalSmallSegSize) {
        // the total size of small segments is big enough,
        // promote the small segments to a large segment and do balanced merge,

        if (totalSmallSegSize < targetSegSize * 2) {
            MergeSpecification spec = findBalancedMerges(infos, numLargeSegs, (numLargeSegs - 1),
                    _partialExpunge);
            if (spec == null)
                spec = new MergeSpecification(); // should not happen
            spec.add(new OneMerge(infos.asList().subList(numLargeSegs, numSegs)));
            return spec;
        } else {
            return findBalancedMerges(infos, numSegs, numLargeSegs, _partialExpunge);
        }
    } else if (_maxSegments < numSegs) {
        // we have more than _maxSegments, merge small segments smaller than targetSegSize/4
        MergeSpecification spec = new MergeSpecification();
        int startSeg = numLargeSegs;
        long sizeThreshold = (targetSegSize / 4);
        while (startSeg < numSegs) {
            info = infos.info(startSeg);
            if (size(info) < sizeThreshold)
                break;
            startSeg++;
        }
        spec.add(new OneMerge(infos.asList().subList(startSeg, numSegs)));
        return spec;
    } else {
        // apply the log merge policy to small segments.
        List<SegmentInfo> smallSegmentList = infos.asList().subList(numLargeSegs, numSegs);
        SegmentInfos smallSegments = new SegmentInfos();
        smallSegments.addAll(smallSegmentList);
        MergeSpecification spec = super.findMerges(smallSegments);

        if (_partialExpunge) {
            OneMerge expunge = findOneSegmentToExpunge(infos, numLargeSegs);
            if (expunge != null) {
                if (spec == null)
                    spec = new MergeSpecification();
                spec.add(expunge);
            }
        }
        return spec;
    }
}