lucene域的(Field)的数据信息(.fdt,.fdx)

2012-05-02

域数据文件(fdt):
 真正保存存储域(stored field)信息的是fdt文件
在一个段(segment)中总共有segment size篇文档,所以fdt文件中共有segment size个项,每
一项保存一篇文档的域的信息
对于每一篇文档,一开始是一个fieldcount,也即此文档包含的域的数目,接下来是fieldcount
个项,每一项保存一个域的信息。

 对于每一个域,fieldnum是域号,接着是一个8位的byte,最低一位表示此域是否分词(tokenized),倒数第二位表示此域是保存字符串数据还是二进制数据,倒数第三位表示此域是否被压缩,再接下来就是存储域的值,比如new Field("title", "lucene in action",Field.Store.Yes, …),则此处存放的就是"lucene in action"这个字符串。

域索引文件(fdx)

 由域数据文件格式我们知道,每篇文档包含的域的个数,每个存储域的值都是不一样的,因而域数据文件中segment size篇文档,每篇文档占用的大小也是不一样的,那么如何在fdt中辨别每一篇文档的起始地址和终止地址呢,如何能够更快的找到第n篇文档的存储域的信息呢?就是要借助域索引文件。

域索引文件也总共有segment size个项,每篇文档都有一个项,每一项都是一个long,大小固定,每一项都是对应的文档在fdt文件中的起始地址的偏移量,这样如果我们想找到第n篇文档的存储域的信息,只要在fdx中找到第n项,然后按照取出的long作为偏移量,就可以在fdt文件中找到对应的存储域的信息。

读取域数据信息的代码如下:

Document FieldsReader.doc(int n, FieldSelector fieldSelector)
 long position = indexStream.readLong();//indexStream points to ".fdx"
 fieldsStream.seek(position);//fieldsStream points to "fdt"
 int numFields = fieldsStream.readVInt();
 for (int i = 0; i < numFields; i++)
 int fieldNumber = fieldsStream.readVInt();
 byte bits = fieldsStream.readByte();
 boolean compressed = (bits & FieldsWriter.FIELD_IS_COMPRESSED) != 0;
 boolean tokenize = (bits & FieldsWriter.FIELD_IS_TOKENIZED) != 0;
 boolean binary = (bits & FieldsWriter.FIELD_IS_BINARY) != 0;
 if (binary)
 int toRead = fieldsStream.readVInt();
 final byte[] b = new byte[toRead];
 fieldsStream.readBytes(b, 0, b.length);
 if (compressed)
 int toRead = fieldsStream.readVInt();
 final byte[] b = new byte[toRead];
 fieldsStream.readBytes(b, 0, b.length);
uncompress(b),
else
 fieldsStream.readString()

 

作者:robotbird, 分类:关于代码 标签: lucene , 浏览(4140), 评论(1)
上一篇: lucene域(Field)的元数据信息(.fnm)
下一篇: 罗马的故事-苏拉

相关文章

(1)条评论 订阅

  1. ${item.nickname} 火币 说:

    其实用的真心不错。

1

发表评论

电子邮件用于回复通知和avatar全球唯一头像 *

*