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

📄 segmentinfos.java

📁 Lucene a java open-source SearchEngine Framework
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package org.apache.lucene.index;/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */import org.apache.lucene.store.Directory;import org.apache.lucene.store.IndexInput;import org.apache.lucene.store.IndexOutput;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.io.PrintStream;import java.util.Vector;final class SegmentInfos extends Vector {      /** The file format version, a negative number. */  /* Works since counter, the old 1st entry, is always >= 0 */  public static final int FORMAT = -1;  /** This format adds details used for lockless commits.  It differs   * slightly from the previous format in that file names   * are never re-used (write once).  Instead, each file is   * written to the next generation.  For example,   * segments_1, segments_2, etc.  This allows us to not use   * a commit lock.  See <a   * href="http://lucene.apache.org/java/docs/fileformats.html">file   * formats</a> for details.   */  public static final int FORMAT_LOCKLESS = -2;  /** This format adds a "hasSingleNormFile" flag into each segment info.   * See <a href="http://issues.apache.org/jira/browse/LUCENE-756">LUCENE-756</a>   * for details.   */  public static final int FORMAT_SINGLE_NORM_FILE = -3;  /** This format allows multiple segments to share a single   * vectors and stored fields file. */  public static final int FORMAT_SHARED_DOC_STORE = -4;  /* This must always point to the most recent file format. */  private static final int CURRENT_FORMAT = FORMAT_SHARED_DOC_STORE;    public int counter = 0;    // used to name new segments  /**   * counts how often the index has been changed by adding or deleting docs.   * starting with the current time in milliseconds forces to create unique version numbers.   */  private long version = System.currentTimeMillis();  private long generation = 0;     // generation of the "segments_N" for the next commit  private long lastGeneration = 0; // generation of the "segments_N" file we last successfully read                                   // or wrote; this is normally the same as generation except if                                   // there was an IOException that had interrupted a commit  /**   * If non-null, information about loading segments_N files   * will be printed here.  @see #setInfoStream.   */  private static PrintStream infoStream;  public final SegmentInfo info(int i) {    return (SegmentInfo) elementAt(i);  }  /**   * Get the generation (N) of the current segments_N file   * from a list of files.   *   * @param files -- array of file names to check   */  public static long getCurrentSegmentGeneration(String[] files) {    if (files == null) {      return -1;    }    long max = -1;    for (int i = 0; i < files.length; i++) {      String file = files[i];      if (file.startsWith(IndexFileNames.SEGMENTS) && !file.equals(IndexFileNames.SEGMENTS_GEN)) {        long gen = generationFromSegmentsFileName(file);        if (gen > max) {          max = gen;        }      }    }    return max;  }  /**   * Get the generation (N) of the current segments_N file   * in the directory.   *   * @param directory -- directory to search for the latest segments_N file   */  public static long getCurrentSegmentGeneration(Directory directory) throws IOException {    String[] files = directory.list();    if (files == null)      throw new IOException("cannot read directory " + directory + ": list() returned null");    return getCurrentSegmentGeneration(files);  }  /**   * Get the filename of the current segments_N file   * from a list of files.   *   * @param files -- array of file names to check   */  public static String getCurrentSegmentFileName(String[] files) throws IOException {    return IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS,                                                 "",                                                 getCurrentSegmentGeneration(files));  }  /**   * Get the filename of the current segments_N file   * in the directory.   *   * @param directory -- directory to search for the latest segments_N file   */  public static String getCurrentSegmentFileName(Directory directory) throws IOException {    return IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS,                                                 "",                                                 getCurrentSegmentGeneration(directory));  }  /**   * Get the segments_N filename in use by this segment infos.   */  public String getCurrentSegmentFileName() {    return IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS,                                                 "",                                                 lastGeneration);  }  /**   * Parse the generation off the segments file name and   * return it.   */  public static long generationFromSegmentsFileName(String fileName) {    if (fileName.equals(IndexFileNames.SEGMENTS)) {      return 0;    } else if (fileName.startsWith(IndexFileNames.SEGMENTS)) {      return Long.parseLong(fileName.substring(1+IndexFileNames.SEGMENTS.length()),                            Character.MAX_RADIX);    } else {      throw new IllegalArgumentException("fileName \"" + fileName + "\" is not a segments file");    }  }  /**   * Get the next segments_N filename that will be written.   */  public String getNextSegmentFileName() {    long nextGeneration;    if (generation == -1) {      nextGeneration = 1;    } else {      nextGeneration = generation+1;    }    return IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS,                                                 "",                                                 nextGeneration);  }  /**   * Read a particular segmentFileName.  Note that this may   * throw an IOException if a commit is in process.   *   * @param directory -- directory containing the segments file   * @param segmentFileName -- segment file to load   * @throws CorruptIndexException if the index is corrupt   * @throws IOException if there is a low-level IO error   */  public final void read(Directory directory, String segmentFileName) throws CorruptIndexException, IOException {    boolean success = false;    // Clear any previous segments:    clear();    IndexInput input = directory.openInput(segmentFileName);    generation = generationFromSegmentsFileName(segmentFileName);    lastGeneration = generation;    try {      int format = input.readInt();      if(format < 0){     // file contains explicit format info        // check that it is a format we can understand        if (format < CURRENT_FORMAT)          throw new CorruptIndexException("Unknown format version: " + format);        version = input.readLong(); // read version        counter = input.readInt(); // read counter      }      else{     // file is in old format without explicit format info        counter = format;      }            for (int i = input.readInt(); i > 0; i--) { // read segmentInfos        addElement(new SegmentInfo(directory, format, input));      }            if(format >= 0){    // in old format the version number may be at the end of the file        if (input.getFilePointer() >= input.length())          version = System.currentTimeMillis(); // old file format without version number        else          version = input.readLong(); // read version      }      success = true;    }    finally {      input.close();      if (!success) {        // Clear any segment infos we had loaded so we        // have a clean slate on retry:        clear();      }    }  }  /**   * This version of read uses the retry logic (for lock-less   * commits) to find the right segments file to load.   * @throws CorruptIndexException if the index is corrupt   * @throws IOException if there is a low-level IO error   */  public final void read(Directory directory) throws CorruptIndexException, IOException {    generation = lastGeneration = -1;    new FindSegmentsFile(directory) {      protected Object doBody(String segmentFileName) throws CorruptIndexException, IOException {        read(directory, segmentFileName);        return null;      }    }.run();  }  public final void write(Directory directory) throws IOException {    String segmentFileName = getNextSegmentFileName();    // Always advance the generation on write:    if (generation == -1) {      generation = 1;    } else {      generation++;    }    IndexOutput output = directory.createOutput(segmentFileName);    boolean success = false;    try {      output.writeInt(CURRENT_FORMAT); // write FORMAT      output.writeLong(++version); // every write changes                                   // the index      output.writeInt(counter); // write counter      output.writeInt(size()); // write infos      for (int i = 0; i < size(); i++) {        info(i).write(output);      }             }    finally {      try {        output.close();        success = true;      } finally {        if (!success) {          // Try not to leave a truncated segments_N file in          // the index:          directory.deleteFile(segmentFileName);        }      }    }    try {      output = directory.createOutput(IndexFileNames.SEGMENTS_GEN);      try {        output.writeInt(FORMAT_LOCKLESS);        output.writeLong(generation);        output.writeLong(generation);      } finally {        output.close();      }    } catch (IOException e) {      // It's OK if we fail to write this file since it's      // used only as one of the retry fallbacks.    }        lastGeneration = generation;  }  /**   * Returns a copy of this instance, also copying each   * SegmentInfo.   */    public Object clone() {    SegmentInfos sis = (SegmentInfos) super.clone();    for(int i=0;i<sis.size();i++) {      sis.setElementAt(((SegmentInfo) sis.elementAt(i)).clone(), i);    }    return sis;  }  /**   * version number when this SegmentInfos was generated.   */  public long getVersion() {    return version;  }  public long getGeneration() {    return generation;  }  public long getLastGeneration() {    return lastGeneration;  }  /**   * Current version number from segments file.   * @throws CorruptIndexException if the index is corrupt   * @throws IOException if there is a low-level IO error   */  public static long readCurrentVersion(Directory directory)    throws CorruptIndexException, IOException {    return ((Long) new FindSegmentsFile(directory) {        protected Object doBody(String segmentFileName) throws CorruptIndexException, IOException {          IndexInput input = directory.openInput(segmentFileName);

⌨️ 快捷键说明

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