Lucene索引存储实现

      Lucene 的抽象类Directory 主要是为我们提供一个简单的文件类存储API,它隐藏了实现存储的细节信息。当Lucene 需要对索引中的文件进行读写操作时,它会调用Directory 子类的对应方法来进行。下表列出了Lucene 3.0所支持的5个核心Directory 实现。

 

Directory子类描述
SimpleFSDirectory最简单的Directory 子类,使用java.io.* API 将文件存入文件系统。不能很好支持多线程操作
NIOFSDirectory使用java.nio.* API 将文件保存至文件系统。能很好的支持除windows 之外的多线程操作
MMapDirectory使用内存映射I/O 进行文件访问,对于64位JRE 来说是一个很好的选择,对于32位JRE并且索引尺寸相对较小时也可以使用该类
RAMDirectory将所有文件都存入RAM
FileSwitchDirectory使用两个文件目录,根据文件扩展名在两个目录之间切换使用

表1:Lucene的几个核心Directory子类

 

      这些 Directory 子类负责从文件系统中读写文件。它们都是继承于抽象基类FSDirectory。遗憾的是,这几个子类都会在一些情况下面临很大局限:

  • SimpleFSDirectory 使用 java.io.* API访问文件。该类并不支持多线程情况下的读操作,因为要做到这点就必须在内部加锁,而 java.io.* 并不支持按位置读取。
  • NIOFSDirectory 使用java.nio.* API 所提供的位置读取接口,这样就能在没有内部锁的情况下支持多线程读取操作。
  • MMapDirectory 使用内存映射的 I/O 接口进行读操作,这样就不需要采用锁机制,并能很好的支持多线程读操作。但是由于内存映射的 I/O 所消耗的地址空间是与索引尺寸相等的,所以建议最好只是用64位的JRE。

      Directory 类对索引的读写操作通过 DataInput/DataOutput 类来进行,这两个抽象类提供了基本数据类型的读写实现。这里还要提一下,Lucene 索引文件中,使用以下基本类型来保存信息:

  • byte:最基本的类型,长8位(bit);
  • UInt32:由4 bytes组成;
  • UInt64:由8 bytes组成;
  • chars: 由UTF-8编码的一系列bytes;
  • Vint:变长的整数类型,它可能包括多个Byte,对每个Byte的8位,其中后七位表示数值,第八位表示后面是否还有Byte,0表示没有,1表示有。2.前面的字节表示的数值的地位,后面的字节表示数值的高位。
  • String:一个字符串首先是一个VInt来表示此字符串包含的字符个数,接着便是UTF-8编码的字符序列。
      DataInput、DataOutput提供的操作接口也都是依据这些数据类型,看一看DataInput类的结构就一目了然了。


图1:DataInput

      readByte() 是其他方法都是通过调用readByte() 方法,从中读取操作需要的字节。该方法是抽象的,DataInput 不同子类有不同的实现方式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值