前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >lucene工具类FixedBitSet源码解析

lucene工具类FixedBitSet源码解析

原创
作者头像
LuceneReader
修改2020-01-15 18:19:14
8610
修改2020-01-15 18:19:14
举报

FixedBitSet在lucene中的一个主要用途是存储文档号,该类使用一个bit来存储一个文档号,在最好的情况下,该类可以使用一个long(64位)来存储64个docId, 该类特别适合存储没有重复的Int类型的数据,下面通过讲解该类中的几个方法的源码,以此来了解该类的存储原理,理解该类对于理解lucene的docId遍历有一定的帮助。

1. 该类的构造函数

代码语言:javascript
复制
public FixedBitSet(int numBits)

public FixedBitSet(long[] storedBits, int numBits)
代码语言:javascript
复制
  /**
   * Creates a new LongBitSet.
   * The internally allocated long array will be exactly the size needed to accommodate the numBits specified.
   * @param numBits the number of bits needed
   */
   // 通过参数提供的bit的个数,计算long数组的长度,long数组的长度计算公式((numBits - 1) >> 6) + 1
  public FixedBitSet(int numBits) {
    this.numBits = numBits;
    bits = new long[bits2words(numBits)];
    numWords = bits.length;
  }

2. 该类主要方法

2.1 public void set(int index)

代码语言:javascript
复制
  public void set(int index) {
    assert index >= 0 && index < numBits: "index=" + index + ", numBits=" + numBits;
    // 计算参数index应该落在long数组中的那个位置上,index >> 6, 右移6位相当于除以64,即long的bit位数 
    int wordNum = index >> 6;      // div 64
    // 计算index是上面计算出来的long数组指定位置的元素的哪一位,对该位进行置位
    long bitmask = 1L << index;
    // 对该位进行 或 操作, 即对该位进行置位
    bits[wordNum] |= bitmask;
  }

public int nextSetBit(int index)

代码语言:javascript
复制
  // 计算大于等于参数index的位置被置位的Index
  public int nextSetBit(int index) {
    // Depends on the ghost bits being clear!
    assert index >= 0 && index < numBits : "index=" + index + ", numBits=" + numBits;
    // 计算该index落在long数组的哪个元素上
    int i = index >> 6;
    // 丢弃该index右侧的位
    long word = bits[i] >> index;  // skip all the bits to the right of index
    // 如果word的值不为0,说明大于等于index的位中存在被置位(1)的位
    if (word!=0) {
      // 返回大于等于该index,第一个被置位的Index(从低位到高位)
      return index + Long.numberOfTrailingZeros(word);
    }
    // 运行到此处,说明上面计算出的元素所有的位全部为0,需要向后遍历数组的元素,找出第一个被置位的Index
    while(++i < numWords) {
      word = bits[i];
      if (word != 0) {
        return (i<<6) + Long.numberOfTrailingZeros(word);
      }
    }
    // 没有比index指定的位更高的位被置位
    return DocIdSetIterator.NO_MORE_DOCS;
  }

到此为止,已经介绍了FixedBitSet中两个重要的方法,该类的源码比较容易理解,因此不再此处讲解更多的此类中的方法,了解该类的源码对lucene搜索过程中遍历docId有一定的帮助。后面的源码分析文章中会详细介绍lucene的索引和搜索过程中的源码。敬请期待

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档