sqlite全文搜索:fts
来源:互联网 发布:域名怎么过户 编辑:程序博客网 时间:2024/04/30 10:05
//--------------------------------------------------------------------------------------------------------------------------------
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全文搜索:fts
- SQLite中使用全文搜索FTS
- SQLite中的全文搜索
- iOS/Android SQLite 全文检索——FTS (Full Text Search)
- 用SQlite進行全文搜索
- sqlite中fts的数据结构说明:doclist
- 全文搜索
- 全文搜索
- 全文搜索
- 全文搜索
- sqlite中fts的数据结构说明:segment leaf nodes
- sqlite中fts的数据结构说明:segment Interior nodes
- SQLite的全文检索
- 页面内全文搜索
- 全文搜索lucene简介
- SQL SERVER全文搜索
- MySQL 全文搜索
- [转] 走进全文搜索
- 数据结构与算法之初体验(一)
- 关于ttyS与ttySAC
- Android应用自动更新功能的代码实现
- Java如何设置图片的透明度
- 内核定时器
- sqlite全文搜索:fts
- nginx配置
- LDA 中拉格朗日乘子的应用
- gdb调试 打印输出长变量的值到外部文本里
- 【iphone开发】调用系统的设置界面
- 大端模式 小端模式
- 当前不会命中断点,源代码与原始版本不同
- 紫薇花开的季节(二)
- Bash中使用MySQL导入导出CSV格式数据