`
xiaodongdong
  • 浏览: 80270 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Lucene4学习笔记之索引文件介绍与数据类型

 
阅读更多

 

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

文档和字段的lengthboost系数的编码

每个文档的值(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

写入格式为:VIntChars,字符串长度加字符串值

前面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,对于每个Byte8位,其中后7位表示数值,最高1位表示是否还有另一个Byte0表示没有,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);
  }

 

  • 大小: 58.3 KB
3
1
分享到:
评论

相关推荐

    本人的Lucene2.9学习笔记

    本人的Lucene2.9学习笔记 本人的Lucene2.9学习笔记 本人的Lucene2.9学习笔记 本人的Lucene2.9学习笔记本人的Lucene2.9学习笔记本人的Lucene2.9学习笔记 本人的Lucene2.9学习笔记

    lucene 对 xml建立索引

    lucene 对 xml建立索引 建立索引就是怎么简单 呵呵

    Lucene 3.6 学习笔记

    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 第三章...

    Lucene5学习之增量索引(Zoie)

    NULL 博文链接:https://iamyida.iteye.com/blog/2199848

    lucene索引文件格式介绍

    lucene索引文件格式介绍,很详细,每一个文件都解释了,一目了然,做项目用的

    Lucene索引文件查看工具lukeall4.7.1

    lukeall,Lucene索引文件查看工具可支持Lucene4.7版本的索引查看,直接双击打开,选择索引目录进行使用

    Lucene之删除索引

    Lucene之删除索引 Lucene之删除索引 Lucene之删除索引 http://blog.csdn.net/nupt123456789/article/details/10666105

    Lucene索引器实例

    Lucene索引器实例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学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习...

    lucene索引非txt文档笔记

    lucene 是全开源文索引搜索引擎,使用它可以很快的架设我们自己的搜索引擎,但遗憾的是它默认只对txt和html格式文档生成index,但我们常常要使用其他的文档如word,pdf等,我搜集了这几种文档生成index的笔记

    Lucene3.0创建索引

    Lucene3.0创建索引 读取目录下的所有txt文档格式的文件,然后生成一个索引文件到某目录下!

    lucene3.5学习笔记

    介绍lucene3.5的相关技术,包括基本用法、分析器、索引建立与查询,扩展的高亮、分页、以及solr3.5的相关用法

    lucene索引查看工具及源码

    lucene索引查看工具及源码lucene索引查看工具及源码lucene索引查看工具及源码

Global site tag (gtag.js) - Google Analytics