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

📄 segmentreader.java

📁 Lucene a java open-source SearchEngine Framework
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
      n -= deletedDocs.count();    return n;  }  public int maxDoc() {    // Don't call ensureOpen() here (it could affect performance)    return si.docCount;  }  public void setTermInfosIndexDivisor(int indexDivisor) throws IllegalStateException {    tis.setIndexDivisor(indexDivisor);  }  public int getTermInfosIndexDivisor() {    return tis.getIndexDivisor();  }  /**   * @see IndexReader#getFieldNames(IndexReader.FieldOption fldOption)   */  public Collection getFieldNames(IndexReader.FieldOption fieldOption) {    ensureOpen();    Set fieldSet = new HashSet();    for (int i = 0; i < fieldInfos.size(); i++) {      FieldInfo fi = fieldInfos.fieldInfo(i);      if (fieldOption == IndexReader.FieldOption.ALL) {        fieldSet.add(fi.name);      }      else if (!fi.isIndexed && fieldOption == IndexReader.FieldOption.UNINDEXED) {        fieldSet.add(fi.name);      }      else if (fi.storePayloads && fieldOption == IndexReader.FieldOption.STORES_PAYLOADS) {        fieldSet.add(fi.name);      }      else if (fi.isIndexed && fieldOption == IndexReader.FieldOption.INDEXED) {        fieldSet.add(fi.name);      }      else if (fi.isIndexed && fi.storeTermVector == false && fieldOption == IndexReader.FieldOption.INDEXED_NO_TERMVECTOR) {        fieldSet.add(fi.name);      }      else if (fi.storeTermVector == true &&               fi.storePositionWithTermVector == false &&               fi.storeOffsetWithTermVector == false &&               fieldOption == IndexReader.FieldOption.TERMVECTOR) {        fieldSet.add(fi.name);      }      else if (fi.isIndexed && fi.storeTermVector && fieldOption == IndexReader.FieldOption.INDEXED_WITH_TERMVECTOR) {        fieldSet.add(fi.name);      }      else if (fi.storePositionWithTermVector && fi.storeOffsetWithTermVector == false && fieldOption == IndexReader.FieldOption.TERMVECTOR_WITH_POSITION) {        fieldSet.add(fi.name);      }      else if (fi.storeOffsetWithTermVector && fi.storePositionWithTermVector == false && fieldOption == IndexReader.FieldOption.TERMVECTOR_WITH_OFFSET) {        fieldSet.add(fi.name);      }      else if ((fi.storeOffsetWithTermVector && fi.storePositionWithTermVector) &&                fieldOption == IndexReader.FieldOption.TERMVECTOR_WITH_POSITION_OFFSET) {        fieldSet.add(fi.name);      }    }    return fieldSet;  }  public synchronized boolean hasNorms(String field) {    ensureOpen();    return norms.containsKey(field);  }  static byte[] createFakeNorms(int size) {    byte[] ones = new byte[size];    Arrays.fill(ones, DefaultSimilarity.encodeNorm(1.0f));    return ones;  }  private byte[] ones;  private byte[] fakeNorms() {    if (ones==null) ones=createFakeNorms(maxDoc());    return ones;  }  // can return null if norms aren't stored  protected synchronized byte[] getNorms(String field) throws IOException {    Norm norm = (Norm) norms.get(field);    if (norm == null) return null;  // not indexed, or norms not stored    synchronized(norm) {      if (norm.bytes == null) {                     // value not yet read        byte[] bytes = new byte[maxDoc()];        norms(field, bytes, 0);        norm.bytes = bytes;                         // cache it        // it's OK to close the underlying IndexInput as we have cached the        // norms and will never read them again.        norm.close();      }      return norm.bytes;    }  }  // returns fake norms if norms aren't available  public synchronized byte[] norms(String field) throws IOException {    ensureOpen();    byte[] bytes = getNorms(field);    if (bytes==null) bytes=fakeNorms();    return bytes;  }  protected void doSetNorm(int doc, String field, byte value)          throws IOException {    Norm norm = (Norm) norms.get(field);    if (norm == null)                             // not an indexed field      return;    norm.dirty = true;                            // mark it dirty    normsDirty = true;    norms(field)[doc] = value;                    // set the value  }  /** Read norms into a pre-allocated array. */  public synchronized void norms(String field, byte[] bytes, int offset)    throws IOException {    ensureOpen();    Norm norm = (Norm) norms.get(field);    if (norm == null) {      System.arraycopy(fakeNorms(), 0, bytes, offset, maxDoc());      return;    }        synchronized(norm) {      if (norm.bytes != null) {                     // can copy from cache        System.arraycopy(norm.bytes, 0, bytes, offset, maxDoc());        return;      }    // Read from disk.  norm.in may be shared across  multiple norms and    // should only be used in a synchronized context.      IndexInput normStream;      if (norm.useSingleNormStream) {        normStream = singleNormStream;      } else {        normStream = norm.in;      }      normStream.seek(norm.normSeek);      normStream.readBytes(bytes, offset, maxDoc());    }  }  private void openNorms(Directory cfsDir, int readBufferSize) throws IOException {    long nextNormSeek = SegmentMerger.NORMS_HEADER.length; //skip header (header unused for now)    int maxDoc = maxDoc();    for (int i = 0; i < fieldInfos.size(); i++) {      FieldInfo fi = fieldInfos.fieldInfo(i);      if (norms.containsKey(fi.name)) {        // in case this SegmentReader is being re-opened, we might be able to        // reuse some norm instances and skip loading them here        continue;      }      if (fi.isIndexed && !fi.omitNorms) {        Directory d = directory();        String fileName = si.getNormFileName(fi.number);        if (!si.hasSeparateNorms(fi.number)) {          d = cfsDir;        }                // singleNormFile means multiple norms share this file        boolean singleNormFile = fileName.endsWith("." + IndexFileNames.NORMS_EXTENSION);        IndexInput normInput = null;        long normSeek;        if (singleNormFile) {          normSeek = nextNormSeek;          if (singleNormStream==null) {            singleNormStream = d.openInput(fileName, readBufferSize);          }          // All norms in the .nrm file can share a single IndexInput since          // they are only used in a synchronized context.          // If this were to change in the future, a clone could be done here.          normInput = singleNormStream;        } else {          normSeek = 0;          normInput = d.openInput(fileName);        }        norms.put(fi.name, new Norm(normInput, singleNormFile, fi.number, normSeek));        nextNormSeek += maxDoc; // increment also if some norms are separate      }    }  }  // for testing only  boolean normsClosed() {    if (singleNormStream != null) {      return false;    }    Iterator it = norms.values().iterator();    while (it.hasNext()) {      Norm norm = (Norm) it.next();      if (norm.refCount > 0) {        return false;      }    }    return true;  }    // for testing only  boolean normsClosed(String field) {      Norm norm = (Norm) norms.get(field);      return norm.refCount == 0;  }  /**   * Create a clone from the initial TermVectorsReader and store it in the ThreadLocal.   * @return TermVectorsReader   */  private TermVectorsReader getTermVectorsReader() {    TermVectorsReader tvReader = (TermVectorsReader)termVectorsLocal.get();    if (tvReader == null) {      tvReader = (TermVectorsReader)termVectorsReaderOrig.clone();      termVectorsLocal.set(tvReader);    }    return tvReader;  }    /** Return a term frequency vector for the specified document and field. The   *  vector returned contains term numbers and frequencies for all terms in   *  the specified field of this document, if the field had storeTermVector   *  flag set.  If the flag was not set, the method returns null.   * @throws IOException   */  public TermFreqVector getTermFreqVector(int docNumber, String field) throws IOException {    // Check if this field is invalid or has no stored term vector    ensureOpen();    FieldInfo fi = fieldInfos.fieldInfo(field);    if (fi == null || !fi.storeTermVector || termVectorsReaderOrig == null)       return null;        TermVectorsReader termVectorsReader = getTermVectorsReader();    if (termVectorsReader == null)      return null;        return termVectorsReader.get(docNumber, field);  }  public void getTermFreqVector(int docNumber, String field, TermVectorMapper mapper) throws IOException {    ensureOpen();    FieldInfo fi = fieldInfos.fieldInfo(field);    if (fi == null || !fi.storeTermVector || termVectorsReaderOrig == null)      return;    TermVectorsReader termVectorsReader = getTermVectorsReader();    if (termVectorsReader == null)    {      return;    }    termVectorsReader.get(docNumber, field, mapper);  }  public void getTermFreqVector(int docNumber, TermVectorMapper mapper) throws IOException {    ensureOpen();    if (termVectorsReaderOrig == null)      return;    TermVectorsReader termVectorsReader = getTermVectorsReader();    if (termVectorsReader == null)      return;    termVectorsReader.get(docNumber, mapper);  }  /** Return an array of term frequency vectors for the specified document.   *  The array contains a vector for each vectorized field in the document.   *  Each vector vector contains term numbers and frequencies for all terms   *  in a given vectorized field.   *  If no such fields existed, the method returns null.   * @throws IOException   */  public TermFreqVector[] getTermFreqVectors(int docNumber) throws IOException {    ensureOpen();    if (termVectorsReaderOrig == null)      return null;        TermVectorsReader termVectorsReader = getTermVectorsReader();    if (termVectorsReader == null)      return null;        return termVectorsReader.get(docNumber);  }    /** Returns the field infos of this segment */  FieldInfos fieldInfos() {    return fieldInfos;  }    /**   * Return the name of the segment this reader is reading.   */  String getSegmentName() {    return segment;  }    /**   * Return the SegmentInfo of the segment this reader is reading.   */  SegmentInfo getSegmentInfo() {    return si;  }  void setSegmentInfo(SegmentInfo info) {    si = info;  }  void startCommit() {    super.startCommit();    rollbackDeletedDocsDirty = deletedDocsDirty;    rollbackNormsDirty = normsDirty;    rollbackUndeleteAll = undeleteAll;    Iterator it = norms.values().iterator();    while (it.hasNext()) {      Norm norm = (Norm) it.next();      norm.rollbackDirty = norm.dirty;    }  }  void rollbackCommit() {    super.rollbackCommit();    deletedDocsDirty = rollbackDeletedDocsDirty;    normsDirty = rollbackNormsDirty;    undeleteAll = rollbackUndeleteAll;    Iterator it = norms.values().iterator();    while (it.hasNext()) {      Norm norm = (Norm) it.next();      norm.dirty = norm.rollbackDirty;    }  }}

⌨️ 快捷键说明

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