热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

有索引的html文档怎么做,索引文件的生成(一)

在执行flush()的过程中,Lucene会将内存中的索引信息生成索引文件,其生成的时机点如下图红色框标注:图1:图一中的流

在执行flush()的过程中,Lucene会将内存中的索引信息生成索引文件,其生成的时机点如下图红色框标注:

图1:

3fe7bdfd39542a3f8a910b8f061652b6.png

图一中的流程是flush()阶段的其中一个流程点,完整的flush()过程可以看系列文章文档提交之flush,索引文件的生成系列文章将会介绍图一中红框标注的每一个流程点,本篇文章先介绍生成索引文件

.tim、.tip、.doc、.pos、.pay流程点。

生成索引文件.tim、.tip、.doc、.pos、.pay

在添加文档阶段,一篇文档中的term所属文档号docId,在文档内的出现次数frequency,位置信息position、payload信息、偏移信息offset,会先被存放到倒排表中,随后在flush()阶段,读取倒排表的信息,将这些信息写入到索引文件.tim、.tip、.doc、.pos、.pay中。

生成索引文件.tim、.tip、.doc、.pos、.pay的流程图

图2:

b98b9070c18689f5746a32b97aa26d68.png

写入索引文件的顺序

图3:

ff92c034e217186aebda45873ad83452.png

在文章倒排表中我们知道,倒排表中的内容按照域进行划分,域之间可能存在相同的term,但是一个域内term是唯一的,故其写入索引文件的顺序如图3所示, 域间(between filed)根据域名(field name)的字典序处理,域内(inner field)按照term的字典序进行处理。

生成索引文件.doc、.pos、.pay

图4:

2aa50d2a048d8ecb423f0cac1eb88dbb.png

我们先介绍在一个域内,生成索引文件.doc、.pos、.pay的逻辑。

生成索引文件.doc、.pos、.pay的流程图

图5:

474e8702aaee8cedd55b8af1ac8f6f2f.png

点击查看大图

图5描述的是同一个域内处理一个term,生成索引文件.doc、.pos、.pay的过程。执行处理前的初始化的工作

图6:

d896fe74eab212f38baf0586f04055d5.png

依次处理当前域中所有的term,并且是按照term的字典序处理。

为什么要按照term的字典序处理:在后面介绍生成索引文件.tim、tip时,需要存储term的值,而相邻有序的term更有可能具有相同的前缀值,那么通过前缀存储(见索引文件之tim&&tip)就可以节省存储空间。

在处理一个term前,我们先要执行处理前的初始化的工作,工作内容为获取上一个term后处理结束后的信息,包括以下信息:docStartFP:当前term在索引文件.doc中的起始位置,在后面的流程中,当前term的文档号docId、词频frequency信息将从这个位置写入,因为索引文件是以数据流的方式存储,所以docStartFP也是上一个term对应的信息在索引文件.doc中的最后位置+1

posStartFP:当前term在索引文件.pos中的起始位置,在后面的流程中,当前term的位置position信息从这个位置写入,因为索引文件是以数据流的方式存储,所以posStartFP也是上一个term对应的信息在索引文件.pos中的最后位置+1

payStartFP:当前term在索引文件.pay中的起始位置,在后面的流程中,当前term的偏移offset、payload信息从这个位置写入,因为索引文件是以数据流的方式存储,所以payStartFP也是上一个term对应的信息在索引文件.pay中的最后位置+1

重置跳表信息:该信息在后面介绍跳表时再展开介绍

图7:

2c3b34678e1c978e7c645550aabaf766.png

图7中,如果当前开始处理第二个term,那么此时docStartFP(docStart File Pointer缩写)、posStartFP、payStartFP如上所示,这几个信息将会被写入到索引文件.tim、.tip中,本文中我们只需要知道生成的时机点,这些信息的作用将在后面的文章中介绍。是否还有文档包含当前term?

图8:

ef3a1ba6239824611d2c51cea8ac0dd5.png

按照文档号从小到大,依次处理当前term在一篇文档中的信息,这些文档中都包含当前term。记录当前文档号到docSeen

图9:

093eb6fe4082a7feb9a7322b8d8e9fcc.png

使用FixedBitSet对象docSeen来记录当前的文档号,docSeen在生成索引文件.tim、tip时会用到,这里我们只要知道它生成的时间点就行。记录term所有文档中的词频totalTermFreq

图10:

f4ef435ce6a3bafb5aab12a1314c2d3d.png

这里说的所有文档指的是包含当前term的文档,一篇文档中可能包含多个当前term,那么每处理一篇包含当前term的文档,term在这篇文档中出现的次数增量到totalTermFreq,totalTermFreq中存储了term在所有文档中出现的次数,同样增量统计docFreq,它描述了包含当前term的文档数量。

totalTermFreq、docFreq将会被存储到索引文件.tim、tip中,在搜索阶段,totalTermFreq、docFreq该值用来参与打分计算(见系列文章查询原理)。是否生成了PackedBlock?

图11:

41349a61f7eecb5c9bc3999cbed868b6.png

每当处理128篇包含当前term的文档,就需要将term在这些文档中的信息,即文档号docId跟词频frequency,使用PackeInts进行压缩存储,生成一个PackedBlock。

图12:

975a9864855dce8859c12351d009fcbd.png

图12中,红框标注的即PackedBlock,关于PackedBlock的介绍以及几个问题在后面的流程中会介绍,这里先抛出这几个问题:为什么要生成PackedBlock

为什么选择128作为生成PackedBlock的阈值写入到跳表skipList中

图13:

931ba4a5b5881471d9b1aa494baf22f8.png

如果生成了一个PackedBlock,那么需要生成跳表,使得能在读取阶段能快速跳转到指定的PackedBlock,跳表skipList的介绍将在后面的文章中详细介绍,这里只要知道生成的时机点即可。记录文档号跟词频信息

图14:

32844b82f491ca813292d49841eced72.png

将文档号跟term在当前文档中的词频frequency分别记录到两个数组docDeltaBuffer、freqBuffer中,注意的是由于文档号是按照从小到大的顺序处理的,所以docDeltaBuffer数组存放的是与上一个文档号的差值,但是term在每个文档中的词频frequency是无序的,所以无法使用差值存储词频frequency,故在freqBuffer数组中,数组元素是原始的词频值。

为什么使用差值存储:

能降低存储空间的使用量,如果我们有下面的待处理的文档号集合,数组中按照文档号从小到大有序:int[] docIds = {1, 3, 7, 10, 12, 13, 17}

如果我们使用固定字节存储(见PackedInts(一)),那么根据17(数组中的最大值)的二进制为00010001,最少可以使用5个bit位(有效数据位)才能描述17,那么数组的其他元素都是用5个bit位存储的话,一共7个数组元素,共需要5*7 = 35个bit,如果使用差值存储(当前数组元素与前一个数组元素的差值),在计算了差值后,数组docIds如下所示:xxxxxxxxxx

int[] docIds = {1, 2, 4, 3, 2, 1, 4}

docIds数组中最大值为4,二进制位00000100,那么所有数组元素使用3个bit位存储,共需要3*7 = 21个bit,可见能有效的降低存储空间。生成Block

图15:

4093fb3f10c9a820afe932890aa741ec.png

当数组docDeltaBuffer中的数组元素个数达到128个以后,意味着已经处理了128篇文档,此时需要生成Block,即将数组docDeltaBuffer、freqBuffer中的数据经过PackeInts处理后生成一个PackedBlock,如下所示:

图16:

4ee647fa04ad05ffaaf4c1484fc53a79.png

结语

基于篇幅,剩余的流程将在下一篇文档中展开。

点击下载附件



推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 本文介绍了使用Python编写购物程序的实现步骤和代码示例。程序启动后,用户需要输入工资,并打印商品列表。用户可以根据商品编号选择购买商品,程序会检测余额是否充足,如果充足则直接扣款,否则提醒用户。用户可以随时退出程序,在退出时打印已购买商品的数量和余额。附带了完整的代码示例。 ... [详细]
  • 开发笔记:使用JavaScript解决网页图片拉伸问题
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了使用JavaScript解决网页图片拉伸问题相关的知识,希望对你有一定的参考价值。 ... [详细]
  • ES基本原理名词解释In-memorybuffer:ES内存缓冲区,新建的document写入的地方document:索引和搜索的 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
  • asp.net 有什么框架,有什么技术
    原文地址:http:www.cnblogs.comvirusswbarchive201201102318169.html文章写的很好,转载一些到自己的博 ... [详细]
author-avatar
dmcm0011
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有