//--------------------------------------------------------------------------------------------------------------------------------
varints: 通过变长字节表示一个int型的数值。通过每个字节的最高位来表示字节流是否接受,当最高位为1,表示字节流还没有结束,当最高位为0,表示字节流结束。总是先存低字节,再存储高字节。举个例子:
1 --> 0x01
127 --> 0x7f
128 ---> 0x81 0x00
docment:就是一条记录,每条记录都有个docid的字段,索引就是保存这个docid,通过这个id就可以唯一定位到一个docment。
term:基本上就是一个word,可以索引的输入内容。比如 docment的内容为“i am docment”,这篇docment可以分出3个term,“i” ,“am”, “docment”。用户输入“docment”就可以找到这篇docment。
segment:b-tree中的一个节点,分为leaf node和 interior nodes,看名字就知道啥意思了。
// ---------------------------------------------------------------------------------------------------------------------------------------
fts的表称为虚表,意思这个表并不是真实存在。对应每个续表,都有3张真实的表格来保存所有信息。
比如创建虚表 fts_paper,sqlite会自己创建3张对应的表:fts_paper_content,fts_paper_segdir,fts_paper_segments.
可以看出来,就是在虚表名后面加上3个不同的单词,下面讲下各个表的内容。
fts_paper_content:
包含真实的数据内容,也就是docment,一条记录就是一个docment,每条记录会强制的,自动的,添加一个docid的字段,这个字段保存了int型的整数,在插入数据的时候,如果没有指定docid的值,就是上一个docment的docid加1,如果指定,就是存入指定的值。
fts_paper_segments:
保存了b-tree的非root节点,一条记录包含一个(blockid, block)。一个block就是一个节点,可以是leaf node,或者是interior node。一个block的大小有限制,当我们不断插入内容到block中,达到block size的上限,这时候需要把block分裂成2个block。一个leaf node分裂成2个leaf node,其对应的父节点就需要增加一个term,如果父节点也达到其block size的上限,父节点也需要分裂。
fts_paper_segdir:
一条记录保存了一课b-tree的root node,在fts_paper_segments那些block属于这棵b-tree。当数据量比较少的时候,root node可以存下整个b-tree,其本身是一个leaf node,这时候fts_paper_segments为空,因为没有非root node需要保存。随着数据的增多,达到root node size的上限,这时候需要把node分裂成2个node,同时生成一个新的root node。分裂出来的2个node就要保存到fts_paper_segments,新的root node保留在当前记录里面。
上面提到,一条记录就是一颗b-tree,所以一个fts table可以包含很多棵b-tree。不同的b-tree可以有相同的term,但是对应的docment id 必须不同。所以,当你查询一个term对应的docment的时候,你需要便利所有的b-tree,把所有的doc id收集起来。
当一棵b-tree的node不断分裂,只有root node保存在segdir table里,其他node都保存到segment table 中。并且属于同一棵tree的这些非root node一定是顺序的存储在segment table中,先存leaf node,再存interior node。并且这些node都是顺序的,即前面的leaf node包含的term必定小于后面的leaf node所包含的term。相当于从b-tree最底level的node开始,从左往右,存完当前的level的node,再存上一个level的node,还是从左到右。
// ---------------------------------------------------------------------------------------------------------
fts通过b-tree来组织索引。