sphinx索引分析——文件格式和字典是double array trie 检索树,索引存储 – 多路归并排序,文档id压缩 – Variable Byte Coding
1 概述
这是基于开源的sphinx全文检索引擎的架构代码分析,本篇主要描述index索引服务的分析。当前分析的版本 sphinx-2.0.4
2 index 功能
3 文件表
4 索引文件结构
4.1 spa 文件
存储文档属性,在extern文档信息存储模式下使用。
item | item | item | item | item |
---|---|---|---|---|
docid | attr0 | attr1 | attr mva(spm file position) | … |
item | item | item | item | item | item | item |
---|---|---|---|---|---|---|
attr0 min | attr1 min | … | attr0 max | attr1 max | attr mva max | … |
4.2 spi 文件
存储词列表,词id和指向spd文件的指针。
- wordid 采用crc32编码
- 每64个word插入一个检查点,重新开始存储wordid和spd文件偏移的差值
- 保存doc的计数值,hit的计数值
item | item | item | item |
---|---|---|---|
wordid(crc32)或vlb | spd文件偏移的差值 | doc的计数值 | hit的计数值 |
item | item | item |
---|---|---|
checkpoint1 sWord len | sWord | 在文件内的 offset |
4.3 spd 文件
存储每个词id可匹配的文档id列表。
item | item | item | item |
---|---|---|---|
docid vlb | hit count | hit field | hit position |
item | item | item | item |
---|---|---|---|
docid vlb | hit count | field mask | hit file(spp) position 差值 |
4.4 sph 文件
存储索引头信息。
item0 | item1 | item2 | item3 | item4 |
---|---|---|---|---|
version | bits | docinfo mode | schema | min doc |
item5 | item6 | item7 | item8 | item 9 |
---|---|---|---|---|
ckpoint pos | ckpoint count | total doc | total bytes | index setting |
item10 | item 11 | item12 | item13 |
---|---|---|---|
tokenizer | dictionary | kill list | min max index |
4.5 spk 文件
存储kill-lists信息。
4.6 spm 文件
存储mva数据
- 分块存储
- 多路归并排序,创建spm文件
item | item | item |
---|---|---|
docid | A a0,a1,a2 … | B b0,b1,b2 … |
4.7 sps 文件
存储字符串属性
4.8 spp 文件
4.8.1 第一次扫描创建的命中文件(临时存储命中信息)
存储每个词的命中数。
- 文件内分块存储
- 块内同类递增排序,优先级为 wordid > docid > hitpos
- 在wordid,docid相等的条件下,hitpos差分存储
- 在wordid相等的条件下docid差分存储
- wordid差分存储
item | item | item | item | item |
---|---|---|---|---|
wordid0 | docid0 | pos0, pos1, pos2 … | hitcount | field mask |
docid1 | pos0, pos1, pos2 … | hitcount | field mask | |
docid2 | pos0, pos1, pos2 … | hitcount | field mask | |
wordid1 | docid0 | pos0, pos1, pos2 … | hitcount | field mask |
docid1 | pos0, pos1, pos2 … | hitcount | field mask | |
… | … | … | … | … |
4.8.2 最终创建的spp文件格式
当doc切换后存储的第一个是hit position, 后面存储的是差值。
item |
---|
hit position 差值 |
4.9 sps 文件
存储字符串属性数据。
sphinx索引分析——文件格式和字典是double array trie 检索树,索引存储 – 多路归并排序,文档id压缩 – Variable Byte Coding的更多相关文章
- 双数组字典树(Double Array Trie)
参考文献 1.双数组字典树(DATrie)详解及实现 2.小白详解Trie树 3.论文<基于双数组Trie树算法的字典改进和实现> DAT的基本内容介绍这里就不展开说了,从Trie过来的同 ...
- sphinx 源码阅读之分词,压缩索引,倒排——单词对应的文档ID列表本质和lucene无异 也是外部排序再压缩 解压的时候需要全部扫描doc_ids列表偏移量相加获得最终的文档ID
转自:http://github.tiankonguse.com/blog/2014/12/03/sphinx-token-inverted-sort.html 外部排序 现在我们的背景是有16个已经 ...
- double array trie 插入结点总结
双数组Trie树索引的可操作性研究.pdf 提示:任一状态点的移动,会影响其Trie树中父节点的base值的选择以及兄弟结点位置的变动,而兄弟结点的移动又须变更相应的子节点的check值. 设待插入的 ...
- Double Array Trie 的Python实现
不多介绍,可自行Google,或者其它关键词: "datrie" 放代码链接: double_array_trie.py 因为也是一段学习代码,参考的文章都记在里面了,主要参考gi ...
- Elasticsearch压缩索引——lucene倒排索引本质是列存储+使用嵌套文档可以大幅度提高压缩率
注意:由于是重复数据,词法不具有通用性!文章价值不大! 摘自:https://segmentfault.com/a/1190000002695169 Doc Values 会压缩存储重复的内容. 给定 ...
- ES里设置索引中倒排列表仅仅存文档ID——采用docs存储后可以降低pos文件和cfs文件大小
index_options The index_options parameter controls what information is added to the inverted index, ...
- Poseidon 系统是一个日志搜索平台——认证看链接ppt,本质是索引的倒排列表和原始日志数据都存在HDFS,而文档和倒排的元数据都在NOSQL里,同时针对单个filed都使用了独立索引,使用MR来索引和搜索
Poseidon 系统是一个日志搜索平台,可以在百万亿条.100PB 大小的日志数据中快速分析和检索.360 公司是一个安全公司,在追踪 APT(高级持续威胁)事件,经常需要在海量的历史日志数据中检索 ...
- sphinx索引分析续
4.10 同义词文件/Synonym 同义词文件格式 from => to AT &T => AT&T AT & T => AT & T standa ...
- Elasticsearch的索引模块(正排索引、倒排索引、索引分析模块Analyzer、索引和搜索、停用词、中文分词器)
正向索引的结构如下: “文档1”的ID > 单词1:出现次数,出现位置列表:单词2:出现次数,出现位置列表:…………. “文档2”的ID > 此文档出现的关键词列表. 一般是通过key,去 ...
随机推荐
- c++之变量的引用
昨天耀哥在问引用的时候,当时有一点点懵.平时经常用到引用的时候就是函数的参数传递. 引用就是某一变量的一个别名,对引用的操作与对变量直接操作完全一样,但是要注意到的是引用并没有新开辟内存空间,因此并不 ...
- Java 集合常用方法锦集
Java集合非常的重要,尤其在业务中,如果你在熟练的使用Java数据结果的集合工作,将会大大的提高工作效率,减少代码量. 1.集合的互换 1.1 Map转Set Map<Integer, Str ...
- MPI Maelstrom - POJ1502最短路
Time Limit: 1000MS Memory Limit: 10000K Description BIT has recently taken delivery of their new sup ...
- [TCPIP] DNS Note
TCPIP DNS 域名系统 DNS 是一个应用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息. 对DNS的访问是通过一个地址解析器来完成的,在Un ...
- 阅读笔记 火球——UML大战需求分析 2
从大一一开始接触C++的时候,上课模模糊糊的听王辉老师讲,我们第一学期学的是面向过程,第二学期学的是面向对象,迷迷糊糊的上了一年,到了大二的时候,对这个面向什么没有什么深层次的理解.知道学了JAVA ...
- Hibernate学习笔记(一)
2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...
- logback 配置详解(一)——logger、root
1.根节点<configuration>包含的属性 scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true. scanPeriod: 设置监测配置文件 ...
- setTimeout和setInterval的区别以及如何写出效率高的倒计时
1.setTimeout和setInterval都属于js中的定时器,可以规定延迟时间再执行某个操作,不同的是setTimeout在规定时间后执行完某个操作就停止了,而setInterval则可以一直 ...
- md语法之行内代码和代码片续集
md语法之行内代码和代码片 一行之内嵌入一小段代码, 简称行内代码. 其方法为: 用撇号把代码围起来. 比如: import numpy as ny就可以了. 代码片的方法: 三个连续的撇号+pyth ...
- 远程连接redis
1.在ubuntu上的redis作为服务端,默认是打开的 在redis的配置文件redis.conf中,找到bind localhost注释掉. 注释掉本机,局域网内的所有计算机都能访问. bind ...