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

📄 segmentreader.java

📁 一套java版本的搜索引擎源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    } else {      for (int i = 0; i < IndexFileNames.INDEX_EXTENSIONS.length; i++) {        String name = segment + "." + IndexFileNames.INDEX_EXTENSIONS[i];        if (directory().fileExists(name))          files.addElement(name);      }    }    if (si.hasDeletions()) {      files.addElement(si.getDelFileName());    }    boolean addedNrm = false;    for (int i = 0; i < fieldInfos.size(); i++) {      String name = si.getNormFileName(i);      if (name != null && directory().fileExists(name)) {        if (name.endsWith("." + IndexFileNames.NORMS_EXTENSION)) {          if (addedNrm) continue; // add .nrm just once          addedNrm = true;        }        files.addElement(name);      }    }    return files;  }  public TermEnum terms() {    return tis.terms();  }  public TermEnum terms(Term t) throws IOException {    return tis.terms(t);  }  public synchronized Document document(int n, FieldSelector fieldSelector) throws IOException {    if (isDeleted(n))      throw new IllegalArgumentException              ("attempt to access a deleted document");    return fieldsReader.doc(n, fieldSelector);  }  public synchronized boolean isDeleted(int n) {    return (deletedDocs != null && deletedDocs.get(n));  }  public TermDocs termDocs() throws IOException {    return new SegmentTermDocs(this);  }  public TermPositions termPositions() throws IOException {    return new SegmentTermPositions(this);  }  public int docFreq(Term t) throws IOException {    TermInfo ti = tis.get(t);    if (ti != null)      return ti.docFreq;    else      return 0;  }  public int numDocs() {    int n = maxDoc();    if (deletedDocs != null)      n -= deletedDocs.count();    return n;  }  public int maxDoc() {    return si.docCount;  }  /**   * @see IndexReader#getFieldNames(IndexReader.FieldOption fldOption)   */  public Collection getFieldNames(IndexReader.FieldOption fieldOption) {    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.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) {    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    if (norm.bytes == null) {                     // value not yet read      byte[] bytes = new byte[maxDoc()];      norms(field, bytes, 0);      norm.bytes = bytes;                         // cache it    }    return norm.bytes;  }  // returns fake norms if norms aren't available  public synchronized byte[] norms(String field) throws IOException {    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 {    Norm norm = (Norm) norms.get(field);    if (norm == null) {      System.arraycopy(fakeNorms(), 0, bytes, offset, maxDoc());      return;    }    if (norm.bytes != null) {                     // can copy from cache      System.arraycopy(norm.bytes, 0, bytes, offset, maxDoc());      return;    }    IndexInput normStream = (IndexInput) norm.in.clone();    try {                                         // read from disk      normStream.seek(norm.normSeek);      normStream.readBytes(bytes, offset, maxDoc());    } finally {      normStream.close();    }  }  private void openNorms(Directory cfsDir) 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 (fi.isIndexed && !fi.omitNorms) {        Directory d = directory();        String fileName = si.getNormFileName(fi.number);        if (!si.hasSeparateNorms(fi.number)) {          d = cfsDir;        }        long normSeek = (fileName.endsWith("." + IndexFileNames.NORMS_EXTENSION) ? nextNormSeek : 0);        norms.put(fi.name, new Norm(d.openInput(fileName), fi.number, normSeek));        nextNormSeek += maxDoc; // increment also if some norms are separate      }    }  }  private void closeNorms() throws IOException {    synchronized (norms) {      Enumeration enumerator = norms.elements();      while (enumerator.hasMoreElements()) {        Norm norm = (Norm) enumerator.nextElement();        norm.in.close();      }    }  }    /**   * 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    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);  }  /** 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 {    if (termVectorsReaderOrig == null)      return null;        TermVectorsReader termVectorsReader = getTermVectorsReader();    if (termVectorsReader == null)      return null;        return termVectorsReader.get(docNumber);  }  /**   * Return the name of the segment this reader is reading.   */  String getSegmentName() {    return segment;  }  void setSegmentInfo(SegmentInfo info) {    si = info;  }  void startCommit() {    super.startCommit();    rollbackDeletedDocsDirty = deletedDocsDirty;    rollbackNormsDirty = normsDirty;    rollbackUndeleteAll = undeleteAll;    Enumeration values = norms.elements();    while (values.hasMoreElements()) {      Norm norm = (Norm) values.nextElement();      norm.rollbackDirty = norm.dirty;    }  }  void rollbackCommit() {    super.rollbackCommit();    deletedDocsDirty = rollbackDeletedDocsDirty;    normsDirty = rollbackNormsDirty;    undeleteAll = rollbackUndeleteAll;    Enumeration values = norms.elements();    while (values.hasMoreElements()) {      Norm norm = (Norm) values.nextElement();      norm.dirty = norm.rollbackDirty;    }  }}

⌨️ 快捷键说明

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