Lucene4.2源码解析之fdt和fdx文件的读写(续)——fdx文件存储一个个的Block,每个Block管理着一批Chunk,通过docID读取到document需要完成Segment、Block、Chunk、document四级查询,引入了LZ4算法对fdt的chunk docs进行了实时压缩/解压
2017-02-13 20:14
1226 查看
2 索引读取阶段
当希望通过一个DocId得到Doc的全部内容,那么就需要对fdx/fdt文件进行读操作了。具体的代码在CompressingStoredFieldsReader类里面。与CompressingStoredFieldsWriter一样,这些操作都是建立在fdx/fdt文件格式理解的基础上。既然前面有一个比喻:如果fdt是一本书的正文,那么fdx则是书的目录。那么通过docID来得到doc全部内容的这个过程则是需要两个文件联合起来发挥作用。
具体的过程如下:
第一步:在CompressingStoredFieldsIndexReader的构造函数中加载所有的”目录信息”
第二步:确定docID所在Segment,由于starts数组记录了每个Segment的docID的起始值,所以通过二分查找,很快就能定位到对应的Segment.并进入到相应的SegmentReader去读取doc内容。
通过docID确定所在Segment
第三步:确定docID所在的Block
第四步:确定docID所在的Chunk
第五步:根据docID确定的Chunk找到chunk在fdt文件中的起始位置
第六步:读取fdt文件中的Chunk信息,通过<DocLengths>和给定的docID确定整个Chunk存储的所有doc的总长度totalLength和从baseDoc到docID的doc长度length。并用LZ4解压Chunk中的doc内容。当然,并不需要整个chunk的doc都解压,只需要解压到length的长度就可以了。
得到length和totalLength后,就可以解压了。并读取解压后文本的内容,生成Document
这样的话,就通过docID得到了存储到索引中document的所有内容了。
3 总结
fdx/fdt文件不涉及Lucene的核心,只是对索引内容本身的读写操作。而且fdx/fdt的文件格式相当简单明了:fdt文件存储着一个个的Chunk;fdx文件存储一个个的Block,每个Block管理着一批Chunk 。fdt/fdx在Lucene中最有价值的地方在于:
1、给定一个DocId,如何快速还原一个Document。
2、索引内容本身的实时压缩/解压,也就是LZ4算法。这其实是为上一条服务。
3、通过SPI机制,允许用户自定义存储格式。这是Lucene在架构上面的进步。
通过这个过程的解析,也能了解到通过docID读取到document需要完成Segment、Block、Chunk、document四级查询。Segment、Block、Chunk的查找都是二分查找,速度很快,但是Chunk中定位document则是顺序查找,所以Chunk的大小直接影响着读取的性能。
相关文章推荐
- Lucene4.2源码解析之fdt和fdx文件的读写——fdx文件存储一个个的Block,每个Block管理着一批Chunk,通过docID读取到document需要完成Segment、Block、Chunk、document四级查询,引入了LZ4算法对fdt的chunk docs进行了实时压缩/解压
- Lucene4.2源码解析之fdt和fdx文件的读写
- git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
- 解压文件源码(需要引入ant.jar包,解决zip文件名为中文出现乱码问题)
- android中需要读取assets目录下a.txt文件并进行解析
- Win2012R2 Hyper-V初级教程10 — 通过远程管理工具进行非共享存储实时迁移
- sphinx 源码阅读之分词,压缩索引,倒排——单词对应的文档ID列表本质和lucene无异 也是外部排序再压缩 解压的时候需要全部扫描doc_ids列表偏移量相加获得最终的文档ID
- 用Jaxp包中的SAX技术对XML文件进行解析并完成对文件的读取操作.doc
- lucene LZ4 会将doc存储在一个chunk里进行Lz4压缩 ES的_source便如此
- 编写Shell程序,通过编写完成compress1、decompress1函数,选择“压缩”或“解压”以及输入文件名,来自动完成文件的压缩、解压过程。
- sphinx 源码阅读之分词,压缩索引,倒排——单词对应的文档ID列表本质和lucene无异 也是外部排序再压缩 解压的时候需要全部扫描doc_ids列表偏移量相加获得最终的文档ID
- 利用POI对MS Excel进行读写(可以设置写入文件的样式),利用tm-extractor对Word进行读取操作并将信息用(log4j)日志信息显示出
- SQL2000系统表、存储过程、函数的功能介绍及应用2009年01月21日 星期三 11:38虽然使用系统存储过程、系统函数与信息架构视图已经可以为我们提供了相当丰富的元数据信息,但是对于某些特殊的元数据信息,我们仍然需要直接对系统表进行查询。因为SQL
- C#解压RAR压缩文件(--转载--测试通过)
- Unity Application Block--通过配置文件读取映射
- 利用OpenCV进行【视频的读取】与【保存视频文件或者图像】源码!~
- 通过XPathDocument、XmlDocument读取Xml文件中的节点值
- 针对ASP.NET页面实时进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)
- 利用ZipArchive库进行压缩和解压文件
- 利用数据库存储文本文件、图像文件需要的字符串读写方法备忘