摘自:http://blog.csdn.net/cangyingzhijia/article/details/8592441

Sphinx使用的文件包括 “sph”, “spa”, “spi”, “spd”, “spp”, “spm” ,还有锁文件。其中sph是系统的配置文件。其它则为索引文件。

.Spi 文件:保存WordId及指向此WordId对应的文档信息在spd文件的指针。Spi文件在检索程序启动时完全加载入内存。Spi文件是分块的,块内排序,块之间也排序。分块的目的应该是为了快速检索到WordId,因为Spi中的WordId是变长压缩的,索引需要先在块级别做二分定位,再在快内解压缩查找。——这种做法,lucene里是FST,用trie来进行单词和doc ids文件位置存储!
文件结构,每块中结构,wordId实际存储的是差值
WordId | SpdFilePointer | DocNum | HitNum

.Spd文件:文件结构
DocID | [DocInfo] | HitFilePointer | FieldNum | HitNum

.Spp文件: 文件结构
HitPos

.Spa文件:存储DocInfo的文件,检索程序启动时会把此文件加载如内存,sphinx可以指定DocInfo的存储方式,
① 存储到spd文件中(InLine)
②. 另外单独存储。指定此,就会生成spa文件
文件结构:
DocId | DocInfo

.Spm文件:在DocInfo中,有一种特殊的属性,叫MVA,多值属性。Sphinx对此属性特殊处理,需要存储在spm文件中。检索程序启动时会把此文件加载如内存。此(MVA)属性在DocInfo对应位置存储其在此文件中的字节偏移量。
文件结构:
DocId | Anum,A1,A2,…,An | Bnum,B1,B2,…,Bn | …

由于在第一趟扫描过程中会出现WordID相同的不同Hits(不同文档或者不同位置不同字段),二趟前会根据WordID排序,WordID相同的Hits会连续出现并合并(合并到第一次出现的相同WordID中)

下文摘自:http://mysql.taobao.org/monthly/2016/11/05/

sphinx索引文件的简单介绍.

  • 然后我们来看索引的种类以及格式,在sphinx中,每一个索引都包含了下面几个文件:

    • sph文件 保存了索引的头文件,主要是一些索引元信息

      • 实现在WriteHeader/LoadHeader中。
    • spi文件 保存了wordlist,也就是索引文件中最核心的一个文件。
      • 也就是通过spi文件可以迅速的从一个keywords(word)映射到一堆document list。下面就是spi文件的格式(dict=keywords):
byte dummy = 0x01
keyword[] keyword_blocks
keyword is:byte keyword_editcodebyte[] keyword_delta if keyword_editcode == 0: assert keyword_delta = { 0 } return block_end zint doclist_offset zint num_docs zint num_hits if num_docs >= DOCLIST_HINT_THRESH: byte doclist_sizehint if ver >= 31 and num_docs > SKIPLIST_BLOCK: zint skiplist_pos zint skiplist_len if min_infix_len > 0: tag "infix-entries" infix_entry[] infix_hash_entries checkpoint[] checkpoints checkpoint is: dword keyword_len byte[] keyword [ keyword_len ] qword dict_offset if min_infix_len > 0: tag "infix-blocks" infix_block[] infix_hash_blocks tag "dict-header" zint num_checkpoints zint checkpoints_offset zint infix_codepoint_bytes zint infix_blocks_offset 
  • 文件生成是在cidxHit中。
  • spa文件 保存了attribute
  • sps文件 单独保存string类型的attribute值
  • spd文件 保存了document list
    • 所有的document id都保存在这个这个文件中,也就是通过spi文件得到document list的信息后,可以迅速在spd文件中定位document list。
  • spe文件 保存了skip list
  • spk文件 保存了 kill list
  • spm文件 保存了MVA 值
  • spp文件 保存了hit list。
    • 保存了一个word在document中的所有出现的位置。也就是给定一个document 和一个keywords,这个文件将会返回所有的匹配位置(在当前的document中).

其中spp/spi/spd/spa/spe文件的生成都在RtIndex_t::SaveDiskDataImpl中实现。

转自:http://www.xuebuyuan.com/1160253.html

sphinx的倒排索引采用了紧凑的磁盘存储方式,由于应用环境的特 殊,docid是非连续的,其使用过程中我们对它的速度并不满意,其并发和单次查询时间在倒排列表较大的情况下,无论使用进程模式或是线程模式,都不能满 足要求,为此才产生了修改其所索引结构的想法。   

 sphinx的倒排列表存放于spd文件,docid以增量压缩的方式存储,在源码分析过程中,可以看到为了对查询树进行query_node(查询词) 间的"与"、"或"运算,sphinx采用了多层调用,多路归并的方法来完成,这个过程中,为了找到符合某属性条件的docid,会进行 docid->属性之间的二分查找(查询spa文件的hash索引,该索引在系统启动时创建),当查询节点较多,要求返回结果较大的情况下,二分查 找带来的时间消耗是“巨大”的。

  spa文件粗略来说是docid+属性,docid采用递增方式存储,ATTR_NUM0(docid+属性) + ATTR_NUM1(...)  + ....,我们注意到spd中每个词的docid倒排列表,也是使用增量方式存储的,二者存在着共性,因此产生了以ATTR_NUMx来替代docid的 思路,由于spa文件的每个docid属性节点大小固定,因此在系统启动时被加载到固定大小的数组中。在查询时,取得ATTR_NUMx就意味着直接取到 了属性字段,省去了二分查找带来的巨大时间消耗。

转载于:https://www.cnblogs.com/bonelee/p/6249445.html

sphinx索引文件进一步说明——最好是结合lucene一起看,直觉告诉我二者本质无异...相关推荐

  1. sphinx数据文件简析

    Sphinx使用的文件包括 "sph", "spa", "spi", "spd", "spp", & ...

  2. php软件开发--sphinx索引静态化及伪静态

    sphinx索引: sphinx简介如果要加快查询只能使用第三方软件,sphinx和lucence.mysql5.6版本中的innodb1.2的版本也同样支持全文索引中文名:全文索引引擎.只支持英文和 ...

  3. 文件的逻辑结构(1、顺序文件 2、索引文件 3、索引顺序文件)

    文章目录 前言 知识总览 无结构文件 有结构文件 有结构文件的逻辑结构 1.顺序文件 2.索引文件 3.索引顺序文件 检索效率分析 多级索引顺序文件 知识点回顾与重要考点 前言 此篇文章是我在B站学习 ...

  4. Mysql原理解析 - 索引文件的存储结构

    Mysql原理解析 - 索引文件的存储结构 前言 局部性原理 磁盘预读 索引是什么? 1. MSQL为什么索引选择B+树? 1.1 哈希表hash 简介: 局限性: 1.2 二叉树 简介: 局限性: ...

  5. 面试题:mysql 表删除一半数据,B+树索引文件会不会变小???

    今日寄语:努力的阶段,往往是最不养生的阶段! 一张千万级的数据表,删除了一半的数据,你觉得B+树索引文件会不会变小? (答案在文章中!!) 我们先来做个实验,看看表的大小是如何变化的?? 做个实验,让 ...

  6. kafka的topic和分区策略——log entry和消息id索引文件

    Topic在逻辑上可以被认为是一个在的queue,每条消费都必须指定它的topic,可以简单理解为必须指明把这条消息放进哪个queue里. 为了使得Kafka的吞吐率可以水平扩展,物理上把topic分 ...

  7. 如何使用Git解决“错误:错误索引 - 致命:索引文件损坏”

    在git init ,我添加并提交了一些文件,进行了一些更改,添加并提交. 设置git守护程序(在WinXP上的Cygwin下运行)并克隆一次存储库. 现在,我在克隆的存储库中收到此错误: $ git ...

  8. LSM树——LSM 将B+树等结构昂贵的随机IO变的更快,而代价就是读操作要处理大量的索引文件(sstable)而不是一个,另外还是一些IO被合并操作消耗。...

    Basic Compaction 为了保持LSM的读操作相对较快,维护并减少sstable文件的个数是很重要的,所以让我们更深入的看一下合并操作.这个过程有一点儿像一般垃圾回收算法. 当一定数量的ss ...

  9. 数据结构源码笔记(C语言):索引文件建立和查找

    //实现索引文件建立和查找算法#include<stdio.h> #include<malloc.h> #include<string.h> #include< ...

最新文章

  1. 图像处理经典图片Lena背后的故事
  2. php各种编码集详解和在什么情况下进行使用 [php 字符集 显示]
  3. tensorflow全联接层fully_connected参数解释正确的
  4. linux下kegg注释软件,KEGG数据中全部代谢反应和代谢物注释信息的下载
  5. 127.Word Ladder
  6. Spring是如何解决循环依赖的
  7. Spring Boot学习笔记(二)——HelloWorld实现
  8. 删除高频分量matlab,关于FFT之后怎么提出该频率分量
  9. Two Strings Are Anagrams
  10. Spring.net(一)----Spring.NET框架简介及模块说明
  11. BP神经网络详解+原理
  12. Android矢量绘图
  13. java实验——回文是一种“从前向后读”和“从后向前读”都相同的字符串,如“上海自来水来自海上”。设计一个程序,判断字符串是否是回文。
  14. 计算某年某月某日是这一年的第几天
  15. 学生办理美国旅游签全过程
  16. php tp6 错误接管分析,ThinkPHP5 异常接管
  17. KAMA-库夫曼自适应移动均线
  18. KMeans算法的K值以及初始类簇中心点的选取
  19. cacai安装与配置
  20. Windows 10 Enterprise LTSB版本

热门文章

  1. 一个图片 在另一个图片定位_一个好的listing,图片有哪些基本要求
  2. android x86 vulkan,【图片】预告贴,准备同步AndroidIA源码,貌似支持Vulkan【androidx86吧】_百度贴吧...
  3. c语言中栈区运用原理形象图,C语言实现使用动态数组来构造栈结构
  4. c语言字符变量grade如何定义,c语言基础概念笔记
  5. php数组转xml文件,php数组转换成xml格式的实现方法
  6. java rt maven_java – Maven无法使用rt.jar进行编译
  7. linux环境下监控日志的变化命令 tail -f
  8. 机器学习(MACHINE LEARNING)MATLAB遗传算法
  9. %fplot('Untitled1',[-1,2])画图
  10. 在 python中每个模块用什么来实现_Python代码模块热更新机制实现(reload)