⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 logmergepolicy.java

📁 lucene-2.4.0 是一个全文收索的工具包
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
            // We must merge this many segments to leave            // maxNumSegments in the index (from when            // optimize was first kicked off):            final int finalMergeSize = last - maxNumSegments + 1;            // Consider all possible starting points:            long bestSize = 0;            int bestStart = 0;            for(int i=0;i<last-finalMergeSize+1;i++) {              long sumSize = 0;              for(int j=0;j<finalMergeSize;j++)                sumSize += size(infos.info(j+i));              if (i == 0 || (sumSize < 2*size(infos.info(i-1)) && sumSize < bestSize)) {                bestStart = i;                bestSize = sumSize;              }            }            spec.add(new OneMerge(infos.range(bestStart, bestStart+finalMergeSize), useCompoundFile));          }        }              } else        spec = null;    } else      spec = null;    return spec;  }  /**   * Finds merges necessary to expunge all deletes from the   * index.  We simply merge adjacent segments that have   * deletes, up to mergeFactor at a time.   */   public MergeSpecification findMergesToExpungeDeletes(SegmentInfos segmentInfos,                                                       IndexWriter writer)    throws CorruptIndexException, IOException  {    this.writer = writer;    final int numSegments = segmentInfos.size();    message("findMergesToExpungeDeletes: " + numSegments + " segments");    MergeSpecification spec = new MergeSpecification();    int firstSegmentWithDeletions = -1;    for(int i=0;i<numSegments;i++) {      final SegmentInfo info = segmentInfos.info(i);      if (info.hasDeletions()) {        message("  segment " + info.name + " has deletions");        if (firstSegmentWithDeletions == -1)          firstSegmentWithDeletions = i;        else if (i - firstSegmentWithDeletions == mergeFactor) {          // We've seen mergeFactor segments in a row with          // deletions, so force a merge now:          message("  add merge " + firstSegmentWithDeletions + " to " + (i-1) + " inclusive");          spec.add(new OneMerge(segmentInfos.range(firstSegmentWithDeletions, i), useCompoundFile));          firstSegmentWithDeletions = i;        }      } else if (firstSegmentWithDeletions != -1) {        // End of a sequence of segments with deletions, so,        // merge those past segments even if it's fewer than        // mergeFactor segments        message("  add merge " + firstSegmentWithDeletions + " to " + (i-1) + " inclusive");        spec.add(new OneMerge(segmentInfos.range(firstSegmentWithDeletions, i), useCompoundFile));        firstSegmentWithDeletions = -1;      }    }    if (firstSegmentWithDeletions != -1) {      message("  add merge " + firstSegmentWithDeletions + " to " + (numSegments-1) + " inclusive");      spec.add(new OneMerge(segmentInfos.range(firstSegmentWithDeletions, numSegments), useCompoundFile));    }    return spec;  }  /** Checks if any merges are now necessary and returns a   *  {@link MergePolicy.MergeSpecification} if so.  A merge   *  is necessary when there are more than {@link   *  #setMergeFactor} segments at a given level.  When   *  multiple levels have too many segments, this method   *  will return multiple merges, allowing the {@link   *  MergeScheduler} to use concurrency. */  public MergeSpecification findMerges(SegmentInfos infos, IndexWriter writer) throws IOException {    final int numSegments = infos.size();    this.writer = writer;    message("findMerges: " + numSegments + " segments");    // Compute levels, which is just log (base mergeFactor)    // of the size of each segment    float[] levels = new float[numSegments];    final float norm = (float) Math.log(mergeFactor);    final Directory directory = writer.getDirectory();    for(int i=0;i<numSegments;i++) {      final SegmentInfo info = infos.info(i);      long size = size(info);      // Floor tiny segments      if (size < 1)        size = 1;      levels[i] = (float) Math.log(size)/norm;    }    final float levelFloor;    if (minMergeSize <= 0)      levelFloor = (float) 0.0;    else      levelFloor = (float) (Math.log(minMergeSize)/norm);    // Now, we quantize the log values into levels.  The    // first level is any segment whose log size is within    // LEVEL_LOG_SPAN of the max size, or, who has such as    // segment "to the right".  Then, we find the max of all    // other segments and use that to define the next level    // segment, etc.    MergeSpecification spec = null;    int start = 0;    while(start < numSegments) {      // Find max level of all segments not already      // quantized.      float maxLevel = levels[start];      for(int i=1+start;i<numSegments;i++) {        final float level = levels[i];        if (level > maxLevel)          maxLevel = level;      }      // Now search backwards for the rightmost segment that      // falls into this level:      float levelBottom;      if (maxLevel < levelFloor)        // All remaining segments fall into the min level        levelBottom = -1.0F;      else {        levelBottom = (float) (maxLevel - LEVEL_LOG_SPAN);        // Force a boundary at the level floor        if (levelBottom < levelFloor && maxLevel >= levelFloor)          levelBottom = levelFloor;      }      int upto = numSegments-1;      while(upto >= start) {        if (levels[upto] >= levelBottom) {          break;        }        upto--;      }      message("  level " + levelBottom + " to " + maxLevel + ": " + (1+upto-start) + " segments");      // Finally, record all merges that are viable at this level:      int end = start + mergeFactor;      while(end <= 1+upto) {        boolean anyTooLarge = false;        for(int i=start;i<end;i++) {          final SegmentInfo info = infos.info(i);          anyTooLarge |= (size(info) >= maxMergeSize || info.docCount >= maxMergeDocs);        }        if (!anyTooLarge) {          if (spec == null)            spec = new MergeSpecification();          message("    " + start + " to " + end + ": add this merge");          spec.add(new OneMerge(infos.range(start, end), useCompoundFile));        } else          message("    " + start + " to " + end + ": contains segment over maxMergeSize or maxMergeDocs; skipping");        start = end;        end = start + mergeFactor;      }      start = 1+upto;    }    return spec;  }  /** <p>Determines the largest segment (measured by   * document count) that may be merged with other segments.   * Small values (e.g., less than 10,000) are best for   * interactive indexing, as this limits the length of   * pauses while indexing to a few seconds.  Larger values   * are best for batched indexing and speedier   * searches.</p>   *   * <p>The default value is {@link Integer#MAX_VALUE}.</p>   *   * <p>The default merge policy ({@link   * LogByteSizeMergePolicy}) also allows you to set this   * limit by net size (in MB) of the segment, using {@link   * LogByteSizeMergePolicy#setMaxMergeMB}.</p>   */  public void setMaxMergeDocs(int maxMergeDocs) {    this.maxMergeDocs = maxMergeDocs;  }  /** Returns the largest segment (measured by document   *  count) that may be merged with other segments.   *  @see #setMaxMergeDocs */  public int getMaxMergeDocs() {    return maxMergeDocs;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -