Lucene初探之数据格式详情(三)
今天,我们来了解一下Lucene的域的元数据信息—>.fnm。
一个段包含多个域,每个域都存储一下元数据。fnm文件的详细数据格式大致如下:
如同上面对段的信息的介绍一般,我们来一个个地看一下域中各个不同存储区域的具体含义和作用。
- FNMVersion:代表fnm文件版本号;比如Lucene2.9版本对应的FNMVerion值为-2;
- FieldsCount:如同字面意思一般,代表域的个数;
- Filed X:代表具体的域存储信息,其也可以再次细分为:
- FieldName:域名;
- 8 bits:分别代表的含义如图所示;
如果要详细地深入了解域的元数据信息,则需要下面几点:
- 位置和偏移量的区别:位置是基于词的,偏移量是基于字母或者汉字的;
- 索引域与存储域的区别:一个文档中有的数据可能不需要被索引,但是当用户搜索到该文档时,这些数据希望一同返回,这样可以节省系统再到具体的数据存储区域去查找到必要的数据并填充进来。也就是说这些数据是冗余数据,没有被索引的必要;
- payload的作用:它是存储在倒排表中,和文档号一同存储的和具体每篇文档所相关的一些关键信息,比如用户自定义的文档ID,而不是系统Lucene所默认生成的ID;这样当系统在倒排表中查找到相应的数据中之后就不必再为了这些数据而再次去存储域中查找了,大大地提高了查询效率;它的存储方式大概如下:
了解了fnm文件之后,和域相关的文件还有fdx、fdt两种,下面就让我们来深入了解一下这两种文件的详细情况。
由这幅图我们可以清晰地看到,fdx文件其实是fdt文件的一个索引文件,也就是域索引文件,而fdt文件才是真正的存储域数据的文件。
我们来由下往上看,fdt文件一共有segment.size项,也就是一个一个段所包含的文档数量。每一篇文档都在fdt文件中有一个对应的映射区域;对于每一篇文档,其存储的信息大概是:
- 文档所包含域的个数fieldCount和每个域的详细信息fieldData;
- 对于每一个fieldData文件,又分为fieldNum,一个8bit的扩展信息和真正的存储的域的值;其中8bit的最后一位代表此域是否被分词,倒数第二位代表当前数据是按照字符串存储的还是按照二进制存储的,倒数第三位代表此域是否经过压缩;
看完fdt文件,我们再来看一下fdx文件,其是由一个个的fieldValuePosition组成,其代表的是对应的域在fdt文件中相对起始位置的偏移量(节约存储空间)。
我们看完域的数据存储格式和相关信息之后,还剩下的就是最低层的存储数据单元了–词向量的数据信息。
我们在此先从整体上来看一下词的存储情况:
相信看过上面对域的数据存储分析之后,大家在看到这幅图时一定一眼就明白词向量的大概存储情况了吧,很明显,三个文件—->tvx、tvd、tvf,分别代表词向量索引文件,词向量文档文件、词向量域文件。
- tvx:一个段包含N篇文档,对应这里的N个DocFieldPosition,每一个DocFieldPosition又包含DocumentPosition和FieldPosition,其中DocumentPosition对应的是tvd文件中的位置偏移量,FieldPosition代表tvf文件中的对应位置偏移量;当然,tvx中还有一个TVXVersion,也就是当前txv文件的版本号;
- tvd:一样,本文件除了TVDVerion之外,包含N个FieldInfomation,如上图所示;
- tvf:类似tvd文件,但是在这里,对于每一个TermFreqs,其分别由TermText(词文本)、TermFreq(词频),Positions(词位置),offSet(词的偏移量信息)构成;
以上都是索引的正向信息,下一篇我们将再去了解一下反向信息,敬请期待。