欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

代码日记--lucene3.0.1

程序员文章站 2022-03-05 12:56:30
...
/**
   * Returns a DocIdSet with documents that should be
   * permitted in search results.
   */
  @Override
  public DocIdSet getDocIdSet(IndexReader reader) throws IOException {
    final TermEnum enumerator = query.getEnum(reader);//把过滤好的数据倒排出来
    try {
      // if current term in enum is null, the enum is empty -> shortcut
      if (enumerator.term() == null)
        return DocIdSet.EMPTY_DOCIDSET;
      // else fill into a OpenBitSet
      
      //lucene3最大的改动之一就是使用了这个OpenBitSet。
      //OpenBitSet在处理64位数据或32位方面有较大改进
      //认真看了下。里面的fastget,fastset是重点方法。过滤结果用得比较多。
      final OpenBitSet bitSet = new OpenBitSet(reader.maxDoc());
      
      final int[] docs = new int[32];    //这个32估计改成64野没问题,最终决定在下面                                            
      final int[] freqs = new int[32];
      TermDocs termDocs = reader.termDocs();
      try {
        int termCount = 0;
        do {
          Term term = enumerator.term();
          if (term == null)
            break;
          termCount++;
          termDocs.seek(term);
          while (true) {
            final int count = termDocs.read(docs, freqs);//这里决定了最终过滤出来的文档号
            if (count != 0) {
              for(int i=0;i<count;i++) {
                bitSet.set(docs[i]);
              }
            } else {
              break;
            }
          }
        } while (enumerator.next());//重复循环

        query.incTotalNumberOfTerms(termCount);//存过滤出来的term个数。

      } finally {
        termDocs.close();
      }
      return bitSet;
    } finally {
      enumerator.close();
    }
  }

 lucene中MultiTermQueryWrapperFilter<Q extends MultiTermQuery>,TermRangeFilter过滤操作源代码。

 这个过滤方法,个2.0版本的方法没多大改变,只是原来是返回BitSet,现在是OpenBitSet。日后再看看,这么改起什么重要作用~~

相关标签: lucene