sqlite全文搜索:fts

前端之家收集整理的这篇文章主要介绍了sqlite全文搜索:fts前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

//--------------------------------------------------------------------------------------------------------------------------------

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来组织索引。

猜你在找的Sqlite相关文章