在fts3.c的开头的注释里面就讲解了fts使用到的各个数据块的结构。
1, doclist的结构说明,
**
** A doclist is stored like this:**
** array {
** varint docid;
** array { (position list for column 0)
** varint position; (2 more than the delta from prevIoUs position)
** }
** array {
** varint POS_COLUMN; (marks start of position list for new column)
** varint column; (index of new column)
** array {
** varint position; (2 more than the delta from prevIoUs position)
** }
** }
** varint POS_END; (marks end of positions for this document.
** }
**
array{ X }表示“结构X”不断重复且连续的存储,他们类似一个数组,只是存储的对象X可以是变长。从上面的定义可以看出,X本身也可以是某种array{Y}的组合嵌套。
上面定义了2个宏:
#define POS_END 0
#define POS_COLUMN 1
所以在这个doclist里面0,1被赋予了特殊意义,position的存储值=原始值+2,这样就避开了0,1的冲突。
上面这个数组的含义举个例子说明:
** 数据流: 123 5 9 1 1 14 35 0 234 72 0
** 首先是123,表示docid为123,
** 紧接着描述当前term在各个column出现的位置,理论上为了描述column,应该先出现字节POS_COLUMN,然后下一个字节为0,这样来表示开始column 0的描述,但是实际上,我们没有存储 POS_COLUMN和0,而是直接就开始存储position,这个是对column 0的缺省描述。所以,接下的字节为这个term在column 0的position,为5,9.上面说过position的存储值=原始值+2,所以5和9需要先转换成3和7.同时,在存储position的时候为排过序的,所以从第二个position开始往后,只是存储当前position和前一个position的差值,这样可以起到节省存储空间的目的。所以3和7,最终解释成3和10.表示doc id为123的文档的column 0的第3个单词和第10个单词为描述的term。
** 接下来是1,不是position了(position必须大于等于2),1就是POS_COLUMN,表示这个term还在其他column中出现。(题外话,如果docid在column 0里面没有包含这个term,docid下面的字节值就是POS_COLUMN),接下来还是个1,表示在 column 1中有出现,再接下来就是position 14和35,最终解释成12和45.表示当前term在column 1中也出现过,为第12个单词和第45个单词
** 接下来是0,为POS_END,表示当前doc id的position信息描述结束,下面将是一个新的doc id描述。
** 接下来是234,一个新的docid为234,
** 接下来72,描述column 0中term的position为70.
** 0表示POS_END,当前docid描述结束。
原文链接:https://www.f2er.com/sqlite/201198.html