专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » lucene索引文件:Lucene索引文件格式分析 »正文

lucene索引文件:Lucene索引文件格式分析

来源: 发布时间:星期四, 2009年1月15日 浏览:18次 评论:0
  、       Lucene源码实现分析介绍说明

  通过以上对Lucene系统结构分析我们已经大致清楚了Lucene系统组成以及在Lucene系统的上开发步骤接下来我们试图来分析Lucene项目(采用Lucene 1.2版本)源码实现考察其实现细节这不仅仅是我们尝试用C语言重新实现Lucene必须工作也是进步做Lucene开发工作必要准备因此部分所涉及到内容对于Lucene上应用开发也是有价值尤其是本部分所做文件格式分析

  由于本文建立在我们毕设项目的上且同时我们需要实现cLucene项目因此很遗憾我们并没有完全完成Lucene所有源码实现分析工作接下来部分我们将涉及部分为Lucene文件格式分析Lucene中存储抽象模块分析以及Lucene中索引构建逻辑模块分析部分我们主要涉及到是文件格式分析和存储抽象模块分析

   2、       Lucene索引文件格式

  在Luceneweb站点上有有关Lucene文件格式规范标准其规定了Lucene文件格式采取存储单位、组织结构、命名规范标准等等内容但是它仅仅是个规范标准介绍说明并没有从实现者角度来衡量这个规范标准实现因此我们以下内容结合了我们自己分析和文件格式定义规范标准以期望给出个更加清晰文件格式介绍说明具体文档规范标准可以参考后面文献2

  首先在Lucene文件格式中以字节为基础定义了如下数据类型:

  表 3.1 Lucene文件格式中定义数据类型

数据类型 所占字节长度(字节) 介绍说明
Byte 1 基本数据类型其他数据类型以此为基础定义
UInt32 4 32位无符号整数高位优先
UInt64 8 64位无符号整数高位优先
VInt 不定最少1字节 动态长度整数每字节最高位表明还剩多少字节每字节低 7位表明整数高位优先可以认为值可以为无限大其举例如下

值 字节1 字节2 字节3
0 00000000
1 00000001
2 00000010
127 01111111
128 10000000 00000001
129 10000001 00000001
130 10000010 00000001
16383 10000000 10000000 00000001
16384 10000001 10000000 00000001
16385 10000010 10000000 00000001


Chars 不定最少1字节 采用UTF-8编码[20]Unicode序列
String 不定最少2字节 由VInt和Chars组成串类型VInt表示Chars长度Chars则表示了String



  以上数据类型就是Lucene索引文件格式中用到全部数据类型由于它们都以字节为基础定义而来因此保证了是平台无关这也是Lucene索引文件格式平台无关主要原因接下来我们看看Lucene索引文件概念组成和结构组成



  图 3.4 存储抽象实现UML图( 3)

  图3.2到3.4展示了整个org.apache.lucene.store中主要继承体系共有 3个抽象类定义:Directory、InputStream和OutputStrem构成了个完整基于抽象文件系统存取体系结构在此基础上实作出了两个实现品:(FSDirectoryFSInputStreamFSOutputStream)和(RAMDirectoryRAMInputStream和RAMOutputStream)前者是以实际文件系统做为基础实现后者则是建立在内存中虚拟文件系统前者主要用来永久保存索引文件后者作用则在于索引操作时是在内存中建立小索引然后次性输出合并到文件中去点我们在后面索引逻辑部分能够看到此外还定以了org.apache.lucene.store.lock和org.apache.lucene.store.with两个辅助内部实现类用在实现Directory思路方法makeLock时候以在锁定索引读写的前来让客户些准备工作

  (FSDirectoryFSInputStreamFSOutputStream)内部实现依托于java语言中io类库只是简单做了个外部逻辑包装这当然要归功于java语言所提供跨平台特性同时也带了些隐患:文件存取效率提升需要依耐于文件类库优化如果需要继续优化文件存取效率应该还提供个文件和目录抽象以根据各种文件系统或者文件类型来提供个优化机会当然这是应用开发者所不需要关系问题

  (RAMDirectoryRAMInputStream和RAMOutputStream)内部实现就比较直接了直接采用了虚拟文件RAMFile类(定义于文件RAMDirectory.java中)来表示文件目录则看作个String和RAMFile对应关联RAMFile中采用来表示文件存储空间在此基础上完成各项操作实现就形成了基于内存虚拟文件系统在实际使用时并不会牵涉到很大字节数量文件因此这种设计是简单直接也是高效率

  这部分实现在理清楚继承体系后相当简单因此接下来部分我们可以通过直接阅读源代码解决接下来我们看看这个部分源代码如何在实际中使用

  般来说我们使用是抽象类提供接口而不是实际实现类本身在实现类中般都含有几个静态比如createFile它能够返回个OutputStream接口或者openFile它能够返回个InputStream接口利用这些接口的中思路方法比如writeStringwriteByte等等我们就能够在抽象层次上处理Lucene定义数据类型读写简单Lucene中存储抽象这部分设计时采用了工厂模式(Factory parttern)[23]我们利用静态类思路方法也就是工厂来创建对象返回接口通过接口来执行操作

   5、       有关cLucene项目

  这部分详细介绍说明了Lucene系统中所采用索引文件格式、些基础类和存储抽象接下来我们来叙述下我们在项目cLucene中重新实现这些结构时候些考虑

  cLucene彻底遵守了Lucene所定义索引文件格式这是Lucene对于各个兼容系统基本要求在此基础上cLucene系统和Lucene系统才能够共享索引文件数据或者说cLucene生成索引文件和Lucene生成索引文件完全等价

  在基础类问题上cLucene同样封装了类似结构我们同样列表描述请和前面表3.2和3.3对照比较

  表 3.4 基础类包cLucene::util

类 介绍说明
Arrays 没有实现直接利用了STL库中快排序算法实现
BitVector C/C语言版本实现和java实现版本类似
Constants 常量静态类定义了些常量但是和java版本区别这里主要定义了些宏
PriorityQueue 这是个类型定义直接利用STL库中std::priority_queue



  表 3.3 基础类包cLucene::document

类 介绍说明
Document C/C语言版本实现和java实现版本类似
Field C/C语言版本实现和java实现版本类似
DateField 没有实现直接利用OpenTop库中ot::StringUtil



  存储抽象实现上也同样是类似于java实现由于我们采用了OpenTop库因此同样得以借助其中对于文件系统抽象ot::io包来解决文件系统问题这部分问题和前面存在优化可能在实现类层次上、对外接口上均和java版本

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: