上篇文章,散仙介绍了.fnm的索引文件格式的具体结构及数据类型,那么本篇呢,将介绍另外两种格式.fdx和fdt。
Stored Field values,代表着存储字段的具体的值,对于在索引里的每一个文档(Document),本质上都是存储着一系列的基于属性名和值的K-V段,其实也就是字段的名和字段的值,这一点和大多数NOSQL的存储格式是非常相似的,都是非常灵活松散的。
存储的字段一般都是关于这个文档的辅助信息,例如:它的标题,URL,或一个标识符是否访问数据库,另外需要在搜索时并取出值的字段,是必须存储的,如果这个字段不是必须存储的,但是检索时却需要被检索,那么在索引时,可以设置索引,不存储,因为索引的大小会影响检索的效率,所以尽量不要浪费索引存储的空间。
存储的字段(Stored Fields)有2个核心的文件。
1,索引字段的数据在.fdx的文件里。
索引通常用于检索特定的文档在字段里,索引里包含一个固定长度的数据使这个文件更加容易的支持随机访问,文档的位置存储在8位的文件里。
每个索引文档都包含一个它对应的存储数据的指针,以便于能够更加快速检索。
FieldIndex (.fdx) --> <Header>, <FieldValuesPosition> SegSize
Header --> CodecHeader
FieldValuesPosition --> Uint64
2,字段存储的数据在.fdt的文件里
每个存储的字段都包含如下信息:
FieldData (.fdt) --> <Header>, <DocFieldData> SegSize
Header --> CodecHeader
DocFieldData --> FieldCount, <FieldNum, Bits, Value> FieldCount
FieldCount --> VInt
FieldNum --> VInt
Bits --> Byte
(1)第一个bit位被保留
(2)第二个是一个包含着二进制数据的字段
(3)第三个bit位被保留
(4)第四至第六位,(mask: 0x7<<3)定义一个数字类型的字段
如果没有数字字段存储,所有的bit位将被清除
1<<3: 值是一个int类型
2<<3: 值是一个Long类型
3<<3: 值是一个Float类型
4<<3: 值是一个Double类型
Value 存储的类型可以是字符串,二进制类型,整形,长整型(依赖bit)
BinaryValue 字节类型的存储
ValueSize VInt,变长格式的整形。