代码日记--lucene3.0.1

/**
   * 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。日后再看看,这么改起什么重要作用~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值