lucene读取索引文件到内存-源码解析
来源:互联网 发布:图论 教材 知乎 编辑:程序博客网 时间:2024/06/03 12:26
1.抛出问题:
lucene索引保存在倒排表文件中,那么lucene是如何将这些索引数据读取到内存中的呢?
2.环境说明:
首先需要说明下我的源码环境:我用的是lucene4,然后codec用的是SimpleTextCodec,这个codec的作用是格式化索引,把“黑箱”的索引格式转化成我们可以看得懂的格式,比如,用了SimpleTextCodec以后,我的倒排表文件的后缀是".pst",然后具体的索引内容如图:;解释下,我索引了一个文档,有两个域:content和title,其他的相信你肯定能看懂是什么意思。
3.lucene读取索引源码解析
启动搜索后,第一次搜索会比较慢!这个是lucene自己说的,而且事实也是如此,相信没人会怀疑,但是为什么会这样呢?就是因为第一次搜索的时候需要将索引从文件读入内存!
具体的过程如下:还是以上图表示的索引来说明,这份索引有两个域:content和title,如果现在我只搜索title域,用代码表示类似:
当我们第一次调用search方法的时候,内部会有个loadTerms()方法,就是这个方法用来读取索引文件的,具体源代码如图:
这里需要注意的是:不是加载所有的索引,而是加载搜索指定的域,因此我上面特别指定了只搜索title域。好了,想想lucene读取索引文件内容到内存需要的几个东西,
1.索引文件,即图中的“in”输入流,这个是已知的,因为在初始化的时候就需要指定索引目录;
2."field",即域名,这个也是已知的,因为搜索的时候必须指定,
3.termsStart,这个就是“未知”的了,我们怎么知道哪个域在索引文件的哪个位置呢?这个值肯定是有的,具体方法的源码如图:
显然,在loadTerms()方法之前,就预先将域名和此域在文件中的位置处理了,在调用loadTerms()方法时,只需
在缓存中获取这个位置,这里的fp从字母意思就可以知道是field position的缩写。
接下来估计你也知道了,完全就是文件I/O操作了,源码如图:
(上图的“自己”写错了,是字节)从索引文件中不断的读取字节数组,直到将这个域的所有terms读取完。
好了,以上就是lucene读取索引文件到内存的概要过程,注意这里我只是关注概要过程,有很多细节是没有关注的!而且源码的截图是不完整的,但是却能说明问题。
- lucene读取索引文件到内存-源码解析
- lucene读取索引文件到内存
- Lucene 源码剖析 一 索引文件概述
- 读取Lucene 索引数据
- Lucene总结系列(三)--总述优化方案和呈现实时内存索引实现(结合RAMDirectory源码解析)
- go 读取文件源码解析
- 使用Lucene的IndexReader读取索引文件的信息
- java读取文件到内存
- 读取文件到内存中
- Lucene索引在文件和内存中的数据结构
- Lucene学习笔记-内存与文件索引的简单操作
- Lucene 源码剖析 二 索引文件结构(1)
- Lucene 源码剖析 三 索引文件结构(2)
- Lucene 源码剖析 五 索引文件结构(4)
- solr入门之lucene创建索引和查询索引及查询的源码读取类确定
- 如何读取Lucene索引数据
- lucene的索引文件
- lucene的索引文件
- 冒泡排序小例子
- Ubuntu下把Vim配置成IDE
- ActionScript2.0不使用startDrag的缓冲拖动
- 持币过节也能让钱生钱
- this.gridView1.SetFocusedRowCellValue不能成功运行
- lucene读取索引文件到内存-源码解析
- horizontalAccuracy 检测定位成功
- VS2010/MFC编程入门之十九(常用控件:静态文本框)
- Oracle触发器修改自身字段解决方案
- 项目编程中期的一些问题总结
- ExAllocatePool详解
- iOS 数组
- 还是把自己的东西搬到csdn吧
- 写了个UIButton的分类