这就是搜索引擎--读书笔记五--索引的建立与更新

索引的建立和更新

索引的建立

前一总结里说到,如果索引结构建立好了,可以提高搜索的速度,那么给定一个文档集合,索引是如何建立起来的呢?建立索引的方式有很多种,在这里我就书中提到的三种方法简单总结一下。

两遍文档遍历法

  • 第一次文档遍历

第一次扫描文档集合时,并没有立即开始建立索引,而是收集一些的统计信息,比如文档集合包含的文档个数N、文档集合内包含的不同单词个数M以及每个单词在哪些文档中出现过的信息DF等等。将所有单词对应的DF值全部相加,就可以知道建立最终的索引需要多少内存了,然后在内存中将连续存储区划分成不同大小的片段,词典内某个单词根据自己对应的DF信息,可以通过指针指向属于自己的内存片段的起始位置和终止位置 , 这样在第二遍扫描中,这个单词对应的倒排列表信息会被填充进这个片段中。

  • 第二次文档遍历

这一次扫描的时候,就开始真正建立每个单词的倒排列表信息了,即对每个单词来说,获得包含这个单词的每个文档的文档ID,以及这个单词在文档中出现的次数,这样就可以不断填充第一次遍历扫描所分配的内存空间。当然,如果要记录单词在文档中出现的位置也是可以的,第一次扫描中分配内存时加上这个位置信息就可以了。

值得注意的是:此方法完全是在内存里完成索引的创建过程的,而后面两种方法则是通过内存和磁盘相互配合来完成索引建立任务的。而正因为创建索引是在内存中完成的,所以就要求内存一定要足够大,否则文档集合太大的话,内存不能够满足需求。而对文档集合进行两遍扫描,所以从速度上相比后面两种方法不占优势。

排序法

排序法在建立索引的过程中,始终在内存中分配固定大小的空间用来存放词典信息和索引的中间结果,当分配的空间被消耗光的时候,把中间结果写入磁盘,清空内存里中间结果所占的空间,以用作下一轮存放索引中间结果的存储区。这种情况下,可以把内存看做驿站,它只是一个中间转折点。这种方法分为两个步骤:中间结果内存排序和合并中间结果。

为什么要进行排序呢?主要是为了方便后续的处理。因为在形成中间结果文件前,已经按照单词ID和文档ID进行了排序,所以进入内存缓冲区的数据都是已经排好序的,合并过程中,将不同缓冲区中包含同一个单词ID的信息进行合并,如果某个单词ID的所有信息全部合并完成,那么说明这个单词的倒排列表已经构建完成了,将其写入最终索引中,同时将各个缓冲区中对应这个单词ID信息清空。就这样一直往下进行,直到所有的单词ID对应的倒排列表都已经创建完成。最后的结果,就是最终的索引文件。

归并法

由于排序法有一个不足之处,那就是在将中间结果写入磁盘的时候,词典信息一直在内存中进行维护,这样也会占据一部分的内存。归并法就是对排序法做出了改进,即每次将内存中数据写入磁盘时,包括词典在内的所有中间结果信息都被写入磁盘,这样内存所有内容都可以被清空。

归并法整体流程也是分为两个大的阶段,首先在内存里维护中间结果,当内存占满时,将内存数据写入磁盘临时文件,第二阶段对临时文件进行归并形成最终索引。

归并法和排序法的区别

首先,排序法在内存中存放的是词典信息和三元组数据(单词ID,文档ID,单词频率),在建立索引的过程中,词典和三元组数据并没有直接的联系,词典只是为了将单词映射为单词ID。而归并法则是在内存中建立一个完整的内存索引结构,相当于对目前处理的文档子集建立起了一个倒排索引。

其次,在将中间结果写入磁盘临时文件时,归并法将整个内存的倒排索引写入临时文件,对于某个单词的倒排列表在写入磁盘文件时,将词典项放在列表最前端,之后跟随相应的倒排列表,这样依次将单词和对应的倒排列表写入磁盘文件,随后彻底清空所占内存。而排序法只是将三元组数据排序后写入磁盘文件,词典作为一个映射表一直存储在内存中。

在最后合并为最终索引的过程中,排序法是根据同一单词ID的这样三元组依次进行合并,归并法的临时文件则是每个单词对应的部分倒排列表,所以在合并时针对每个单词的倒排列表进行合并,形成这个单词的最终倒排列表就可以了,与此同时,最后的合并过程中也会形成最终的词典信息。如果大家对算法里的归并排序有所了解的话,就很清楚这种方法了吧。

索引更新策略

常用的索引更新策略有4种:完全重建策略、再合并策略、原地更新策略以及混合策略。

完全重建策略:很直观的方法,当新增文档达到一个数量时,将新增文档和原先的老文档进行合并,然后利用上文提到的建立索引的方式,对所有文档重新建立索引。

再合并策略:有新增文档进入搜索系统时,搜索系统在内存维护临时倒排索引来记录信息,当新增文档达到一定数量的时候,则把临时索引文件和老文档的倒排索引文件进行合并,以生成新的索引。

原地更新策略:在索引合并时,并不生成新的索引文件,而是直接在原先的索引文件里进行追加操作,将增量索引里单词的倒排列表项追加到老索引对应的倒排列表项的末尾,这样的话,就只更新增量索引里出现的单词相关信息,其他单词信息不做变动。

混合策略:结合不同索引更新策略的优势,将不同的索引更新策略混合以形成更高效的方法。

混合策略一般会将单词根据其不同性质进行分类,不同类别的单词,对其索引采取不同的索引更新策略。常见的做法是:根据单词的倒排列表长度进行划分,因为有些单词经常在不同文档中出现,所以其对应的倒排列表就较长,而有些单词很少见,其倒排列表就较短。那么长倒排列表单词采取原地更新策略,因为这种策略能够节省磁盘读写次数;而短倒排列表就采取再和并策略。通过这种根据实际情况来分别采取实际策略的方法,效果体现的比较显著,磁盘的读写操作和各种策略的优势都充分体现出来了。

时间: 2024-08-28 19:59:27

这就是搜索引擎--读书笔记五--索引的建立与更新的相关文章

这就是搜索引擎--读书笔记四--索引基础

搜索引擎索引基础 前几天我阅读了搜索引擎索引这一章,发现倒排索引这一方法确实很巧妙和迷人,它包含的原理和设计方法很独到.所以接下来,我想把我学习到的索引方面的知识给大家讲解一下,总共分为三篇:索引基础.索引建立和更新.索引查询. 我们首先认识倒排索引基本概念 文档:一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖了更多形式,比如Word.PDF.HTML.XML等不同格式的文件都可以称为文档. 文档集合:由若干文档构成的集合称为文档集

这就是搜索引擎--读书笔记六--索引的查询

索引的查询处理 为搜索引擎构建索引,其目的是能更快速地提取与用户查询相关的文档信息,假设搜索引擎已经建立了索引,我们如何利用倒排索引来相应用户的查询呢?这一次的总结就是给大家分享一下搜索引擎对于用户查询的处理过程. 目前有两种常见的查询处理机制,一种称为一次一文档方式,另外一种称为一次一单词方式. 下面我们用一个具体例子来分别说明两种基本查询处理方式的运行机制.在这个例子里,假设用户输入的查询为“搜索引擎 技术”,而“搜索引擎”这个单词对应的倒排列表中,文档ID依次为{1,3,4},“技术”这个

这就是搜索引擎--读书笔记一

这就是搜索引擎 -- 读书笔记一 相信搜索引擎对于每一个爱好算法甚至爱好技术的IT人员都具有强烈的好奇心吧,因为搜索引擎在互联网中的地位实在是不可撼动.想象如果互联网没有了搜索引擎,那么我们平常技术上出现瓶颈了怎么办?甚至连普通的生活都离不开搜索,大学生的你订餐了吗? 搜索引擎已经发展为每个人上网都离不开的重要工具,其技术发展历程是怎样的呢?其基本目标是什么?核心技术问题又是什么呢?在接下来的一系列博文中,我会根据读书和自己的总结用平乏的语言来表达出来,希望对朋友们有所帮助.另外,博友们如果有好

这就是搜索引擎--读书笔记二

网络爬虫基础 前言 通用搜索引擎的处理对象就是互联网网页,目前网页数量以百亿计,所以搜索引擎首先面临的问题就是:如何能够设计出高效的下载系统,以将如此海量的网页数据传送到本地,在本地形成互联网网页的镜像备份. 网络爬虫即起此作用,它是搜索引擎系统中很关键也很基础的构建.本次总结以及接下来的几次总结主要给大家简单介绍一下与网络爬虫相关的技术.说到爬虫,又想到了Python,所以首先了解一下爬虫的简单机制,这样对学习Python爬虫会有很大的帮助. 通用爬虫框架 如图所示 这是一个通用的爬虫框架流程

这就是搜索引擎--读书笔记七--倒排列表压缩算法

倒排列表压缩算法 目前有很多种倒排列表算法可以选择,但是我们对评判算法的优劣需要定量指标.一般会考虑3个指标:压缩率.压缩速度以及解压速度. 压缩率是指数据压缩前和压缩后大小的比例,显然,压缩率越高,就越节约磁盘空间.而压缩速度是压缩单位量的数据所花的时间,但是压缩往往是在建立索引过程中进行的,这是一个后台进行的过程,不需要及时响应用户查询,即使速度慢一些也没有关系.所以普遍来说,压缩速度不是一个重要指标. 那么我们来看看解压速度.顾名思义,解压就是将压缩数据恢复到原始数据.这是一个实时响应过程

这就是搜索引擎--读书笔记三

前言 考虑到上次的网络爬虫总结一文对基础的知识还没有介绍完整,所以今天花一点时间来补充上次的网络爬虫基础知识.这次给大家总结了两个方面的内容:暗网抓取和分布式爬虫.希望对阅读本文的博友们有所收获. 暗网抓取 物理学研究表明,在目前宇宙所有物质的总体质量中,星系等可见物质占其中的20%,不可探测的暗物质占据了总质量的80%.互联网中暗网可以与宇宙的暗物质相类比,而其所占网页的比例,更是远大于暗物质占宇宙质量的比例,大约百倍于目前的明网网页. 什么是暗网 所谓暗网,是指目前搜索引擎爬虫按照常规方式很

这就是搜索引擎--读书笔记八--检索模型与搜索排序

检索模型与搜索排序 前言 搜索结果排序是搜索引擎最核心的构成部分,很大程度上决定了搜索引擎的质量好坏以及用户接受与否.尽管搜索引擎在实际结果排序时融合了上百种排序因子,但最重要的两个因素还是用户查询和网页的内容相关性及网页链接情况.那么,我们得到用户搜索词之后,如何从内容相关性的角度上对网页进行排序输出呢? 判断网页内容是否与用户查询相关,这依赖于搜索引擎所采用的检索模型.搜索引擎的核心是判断哪些文档是和用户需求相关的,并按照相关程度排序输出,所以相关程度计算是将用户查询和文档进行匹配的过程,而

《算法导论》读书笔记(五)

摘要: 本章介绍了二叉查找树的概念及操作.主要内容包括二叉查找树的性质,如何在二叉查找树中查找最大值.最小值和给定的值,如何找出某一个元素的前驱和后继,如何在二叉查找树中进行插入和删除操作.在二叉查找树上执行这些基本操作的时间与树的高度成正比,一棵随机构造的二叉查找树的期望高度为O(lgn),从而基本动态集合的操作平均时间为θ(lgn). 1.二叉查找树 二叉查找树是按照二叉树结构来组织的,因此可以用二叉链表结构表示.二叉查找树中的关键字的存储方式满足的特征是:设x为二叉查找树中的一个结点.如果

《C++程序设计原理与实践》读书笔记(五)

拷贝 我们的vector类型具有如下形式: class vector {     private:     int sz;     double * elem; public:     vector(int s):sz(s),elem(new double[s]){}     ~vector() {delete [] elem;} }; 让我们试图拷贝其中的一个向量: void f(int n) {     vector v(3);     v.set(2, 2.2);     vector v