Lucene生成的索引文件
由上文中提到的代码生成的索引文件如下所示:
格式都相当怪异,那些这些文件里面都存放了些什么东西?我们先来了解如下名词
a) 段信息(SegmentInfo):它包含段的元数据;
b) 字段名(Field name):它包含了用来构建索引的字段名;
c) 存储的字段值(Stored Field values):它包含每一个文档的属性-值(attribute-value)对的列表,其中属性名为字段的名称,用来存储和文档相关的辅助信息。比如标题,网址或者是一个用来访问数据库的标识符,在进行搜索时用来作为key来取得返回值;
d) 词典(Term Dictionary):包含所有文档的所有索引字段中使用的词,也包含一个词在文档中的数量,和词的频率数据、接近度数据的指针;
e) 词的频率数据(Term Frequency Data):对词典里面的每个词而言,都有其在所有文档中包含数量以及在某一个文档中的数量,如果频率这个属性被省略掉就不会出现;
f) 词的接近度数据(Term Proximity Data):在词典中的每个词在每一个文档中的位置数据,如果位置属性被省略了就不会出现;
g) 标准化系数(Normalization Factors):对文档中的每个字段,存储了一个值为该字段的命中值Lucene在计算每个词的权重的时候都会乘上该标准化系数;
h) 词向量(Term Vectors):对文档中的每一个字段,词向量都可能被存储,一个词向量由词文本以及词的频率组成;
i) 每个文档的值(Per-Document Values):但一般都被加载到内存中用于快速访问,虽然存储的值通常用于作为搜索结果的摘要,但每一个文档的值都是非常有用的,比如在计算评分的时候作为评分系数;
j) 删除的文档(Deleted Documents):用来指示哪些文档被删除的文件
名称 |
文件后缀 |
描述 |
段文件(Segments File) |
segments.gen segments_N |
存储提交点信息 |
锁文件(Lock File) |
write.lock |
用来阻止多个indexWriter向同一个文件写数据 |
段信息(Segments Info) |
.si |
存储段的元数据信息 |
复合文件(Compound File) |
.cfs , .cfe |
一个可选的虚拟文件,包括所有其他索引文件系统频繁用完的文件句柄 |
字段信息(Fields) |
.fnm |
存储字段的信息 |
字段索引(Fields Index) |
.fdx |
包含指向字段值的指针 |
字段数据(Field Data) |
.fdt |
存储文档里面的字段信息 |
词典(Term Dictionary) |
.tim |
存储词信息 |
词索引(Term Index) |
.tip |
指向词典的索引 |
频率信息(Frequencies) |
.doc |
包含那些含有每一个词的频率的文档列表 |
位置信息(Positions) |
.pos |
存储词在索引中出现的位置信息 |
Payloads |
.pay |
额外存储每个位置的元数据信息,如字符偏移和用户负载 |
Norms |
.nvd , .nvm |
文档和字段的length和boost系数的编码 |
每个文档的值(Per-Document Values) |
.dvd , .dvm |
额外的得分系数或者每个文档的值信息编码 |
词向量索引(Term Vector Index) |
.tvx |
存储文档的偏移数据文件 |
词向量文件(Term Vector Documents) |
.tvd |
包含有词向量的文档信息 |
词向量字段(Term Vector Fields) |
.tvf |
关于词向量的字段级信息 |
删除文档(Deleted Documents) |
.del |
关于什么文件被删除的信息 |
数据存储基本类型
类型名称 |
说明 |
Byte |
8 bit |
UInt16 |
16 bit 二字节无符号整型,高位优先(short) |
UInt32 |
32 bit四字节无符号整型,高位优先(int) |
UInt64 |
64 bit八字节无符号整型,高位优先(long) |
VInt |
可变长度整型。0-127单字节,128-16383两字节,类推 |
VLong |
可变长度Long型 |
Chars |
UNICODE字符串 |
String |
写入格式为:VInt,Chars,字符串长度加字符串值 |
前面4种类型我们可以将其称为简单类型,因为它们的存储单元均为字节Byte,并遵守高位字节先输出,低位字节后输出的原则。下面以Int32类型为例,看一下它在lucene4中的读写情况:
public void writeInt(int i) throws IOException { writeByte((byte)(i >> 24));//先写入高八位 writeByte((byte)(i >> 16)); writeByte((byte)(i >> 8)); writeByte((byte) i);//最后写入低八位 } public int readInt() throws IOException { //先输出高位;后输出低位 return ((readByte() & 0xFF) << 24) | ((readByte() & 0xFF) << 16) | ((readByte() & 0xFF) << 8) | (readByte() & 0xFF); }
|
VInt类型可能比较难理解,我们来深入看一下:
· 变长的整数类型,它可能包含多个Byte,对于每个Byte的8位,其中后7位表示数值,最高1位表示是否还有另一个Byte,0表示没有,1表示有。
· 越前面的Byte表示数值的低位,越后面的Byte表示数值的高位。
· 例如130化为二进制为 1000, 0010,总共需要8位,一个Byte表示不了,因而需要两个Byte来表示,第一个Byte表示后7位,并且在最高位置1来表示后面还有一个Byte,所以为(1) 0000010,第二个Byte表示第8位,并且最高位置0来表示后面没有其他的Byte了,所以为(0) 0000001
值 |
第一个Byte |
第二个Byte |
第三个Byte |
0 |
00000000 |
|
|
2 |
00000010 |
|
|
… |
|
|
|
127 |
01111111 |
|
|
128 |
10000000 |
00000001 |
|
129 |
10000001 |
00000001 |
|
… |
|
|
|
16383 |
11111111 |
01111111 |
|
16384 |
10000000 |
10000000 |
00000001 |
16385 |
10000001 |
10000000 |
00000001 |
… |
|
|
|
我们看一下它具体的读写代码:
public final void writeVInt(int i) throws IOException { //后七位之前还有为1的位存在 while ((i & ~0x7F) != 0) { //先取出低七位 ,并在第八位补1,指示后面还存在byte writeByte((byte)((i & 0x7F) | 0x80)); i >>>= 7; } //写入余下的八位 writeByte((byte)i); } public int readVInt() throws IOException { //读取第一个byte byte b = readByte(); //大于0即最高位为0,没有下一个byte,直接返回 if (b >= 0) return b; //获取低七位的值 int i = b & 0x7F; //读下一个byte b = readByte(); //获取低七位的值并左移七位与之前的七位数据相加 i |= (b & 0x7F) << 7; if (b >= 0) return i; b = readByte(); i |= (b & 0x7F) << 14; if (b >= 0) return i; b = readByte(); i |= (b & 0x7F) << 21; if (b >= 0) return i; b = readByte(); // i |= (b & 0x0F) << 28; if ((b & 0xF0) == 0) return i; throw new IOException("Invalid vInt detected (too many bits)"); }
|
VLong的相关读写实现与之类似,只是字节数不一样,这里不再重复介绍。最后看一下String相关:
public void writeString(String s) throws IOException { final BytesRef utf8Result = new BytesRef(10); //转码 UnicodeUtil.UTF16toUTF8(s, 0, s.length(), utf8Result); //写入字符串长度 writeVInt(utf8Result.length); //写入字符串值 writeBytes(utf8Result.bytes, 0, utf8Result.length); } public String readString() throws IOException { //读取字符串长度 int length = readVInt(); final byte[] bytes = new byte[length]; //读取一个字符串长度的byte readBytes(bytes, 0, length); return new String(bytes, 0, length, IOUtils.CHARSET_UTF_8); }
|
相关推荐
本人的Lucene2.9学习笔记 本人的Lucene2.9学习笔记 本人的Lucene2.9学习笔记 本人的Lucene2.9学习笔记本人的Lucene2.9学习笔记本人的Lucene2.9学习笔记 本人的Lucene2.9学习笔记
lucene 对 xml建立索引 建立索引就是怎么简单 呵呵
2.3 创建文档并且添加索引 4 2.4 查询索引的基本信息 5 2.5 删除和更新索引 5 (1) 使用writer删除 5 (2) 使用reader删除 5 (3) 恢复删除 5 (4) 彻底删除 6 (5) 更新索引 6 (6) 手动优化 6 2.6 索引文件作用 7 第三章...
NULL 博文链接:https://iamyida.iteye.com/blog/2199848
lucene索引文件格式介绍,很详细,每一个文件都解释了,一目了然,做项目用的
lukeall,Lucene索引文件查看工具可支持Lucene4.7版本的索引查看,直接双击打开,选择索引目录进行使用
Lucene之删除索引 Lucene之删除索引 Lucene之删除索引 http://blog.csdn.net/nupt123456789/article/details/10666105
Lucene索引器实例Lucene索引器实例Lucene索引器实例Lucene索引器实例
这是Lucene3.0索引查看文件 直接运行jar包就可以打开ui界面 陪好路径就可以使用了
深入 Lucene 索引机制深入 Lucene 索引机制深入 Lucene 索引机制深入 Lucene 索引机制深入 Lucene 索引机制深入 Lucene 索引机制
Lucene 删除 合并索引,可以指定几个索引文件合并成一个索引文件。自己写的,有很多不足之处请多指教
Lucene创建索引,查询索引的简单使用。
lucene使用总结笔记lucene使用总结笔记lucene使用总结笔记lucene使用总结笔记lucene使用总结笔记
lucene基础学习笔记&源码
基于lucene技术的增量索引,实现索引的首次创建,动态增删改
lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习...
lucene 是全开源文索引搜索引擎,使用它可以很快的架设我们自己的搜索引擎,但遗憾的是它默认只对txt和html格式文档生成index,但我们常常要使用其他的文档如word,pdf等,我搜集了这几种文档生成index的笔记
Lucene3.0创建索引 读取目录下的所有txt文档格式的文件,然后生成一个索引文件到某目录下!
介绍lucene3.5的相关技术,包括基本用法、分析器、索引建立与查询,扩展的高亮、分页、以及solr3.5的相关用法
lucene索引查看工具及源码lucene索引查看工具及源码lucene索引查看工具及源码