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

索引的查询处理

为搜索引擎构建索引,其目的是能更快速地提取与用户查询相关的文档信息,假设搜索引擎已经建立了索引,我们如何利用倒排索引来相应用户的查询呢?这一次的总结就是给大家分享一下搜索引擎对于用户查询的处理过程。

目前有两种常见的查询处理机制,一种称为一次一文档方式,另外一种称为一次一单词方式。

下面我们用一个具体例子来分别说明两种基本查询处理方式的运行机制。在这个例子里,假设用户输入的查询为“搜索引擎 技术”,而“搜索引擎”这个单词对应的倒排列表中,文档ID依次为{1,3,4},“技术”这个单词对应的倒排列表中,文档ID列表为{1,2,4}。此时我们可以看出,文档1和4同时包含了这两个查询词。

一次一文档

所谓的一次一文档,就是以倒排列表中包含的文档为单位,每次将其中某个文档与查询的最终相似性得分计算完毕,然后开始计算另外一个文档的最终得分,直到所有的文档的得分都计算完毕为止。

对于文档1来说,因为两个单词的倒排列表中都包含这个文档,所以可以根据各自的TF(单词在文档中出现的次数)和IDF(逆文档频率)等参数计算文档和查询单词的相似性,之后将两个分数相加就获得了文档1和用户查询的相似性得分。随后搜索系统开始处理文档2,因为文档2只在“技术”这个词汇的倒排列表中,所以通过TF和IDF即可得出文档2和用户查询的相似性得分。用类似的方法处理文档3和文档4。所有文档都计算完毕后,根据文档得分进行大小排序,输出得分最高的K个文档作为搜索结果输出,即可完成了一次用户查询的响应。

因为搜索系统的输出结果往往是限定个数的,比如指定输出10个结果,所以在实际实现一次一文档时,没有必要保存所有文档的相关性得分,我们只需要在内存中维护一个大小为10的优先级别队列,用来保存目前计算过程中得分最高的K个文档即可,这样可以节省内存和计算时间,一般采用堆来实现这个优先级别队列。

一次一单词

在一次一文档中,我们对单词—文档矩阵中以文档为单位,纵向进行分数累计。而一次一单词则是采取“先横向再纵向”的方式,即首先将某个单词对应的倒排列表中的每个文档ID都计算一个部分相似性得分,在计算完毕某个单词倒排列表中包含的所有文档之后,接着计算下一个单词的倒排列表中包含的文档。

上图所示就是一次一单词的运算机制图示说明。为了保存数据,在内存中使用哈希表来保存中间结果以及最终计算结果。搜索系统首先对包含“搜索引擎”的所有文档进行部分得分计算,并把相似性得分保存在哈希表中。当“搜索引擎”这个单词的所有文档都计算完毕后,开始计算“技术”这个单词的相似性得分,对于文档1来说,同样根据TF和IDF等参数计算文档1和“技术”这个单词的相似性得分,之后查找哈希表,发现文档1已经存在得分(计算“搜索引擎”相似性得分所得),则将哈希表对应的得分和刚刚计算出的得分相加作为最终得分,之后采取相似的方法,依次计算文档2和文档4与“技术”的相似性得分。当全部计算完毕时,哈希表中存储了每个文档和用户查询的最终相似性得分,排序后输出得分最高的K个文档作为搜索的响应结果。这样,就以一次一单词的方式完成了对用户查询的响应。

跳跃指针:查询处理的优化

如果用户输入的查询包含了很多个查询词,搜索引擎一般默认是采取与逻辑来判别文档是否满足要求,即要求文档里必须全部包含查询词,就刚才的例子来说,查询“搜索引擎 技术”这两个关键词,就只有文档1和4符合条件。在这种情况下,很明显我们采用一次一文档的查询处理方式是比较适合的(为什么吗?这个可以自己思考)。

如果倒排列表直接存储包含查询词的文档ID,那么计算交集是非常直观和简单的,我们可以通过归并排序即可获得O(n+m)的时间复杂度的算法,效率还算可以吧。但是,我们之前就讲过,倒排列表中文档的ID是以差值的形式存储的,另外这个差值是以压缩后的方式编码的,那么如何求倒排列表的交集就会变得复杂。

跳跃指针的基本思想是将一个倒排列表数据化整为零,切分为若干个固定大小的数据块,一个数据块为一组,对于每个数据块,增加元信息来记录关于这个块的一些信息,这样即使面对压缩后的倒排列表,在进行倒排列表合并的时候也有两个好处:一个好处是无需解压缩所有倒排列表项,只解压部分数据即可;另一个好处就是无需比较任意两个文档ID,通过这两种方式有效节省了计算资源和存储资源。

说明:图中设定的分组大小为3,书中提到假设倒排列表长度为L(即包含L个文档),使用根号L来作为块的大小效果较好。

问题马上来了,我们如何在一个带有跳跃指针的倒排列表里查找某个文档是否存在呢?

假如我们需要在单词“Baidu”压缩后的倒排列表里查找文档编号为7的文档。首先,对倒排列表前两个数值进行数据解压缩,读取第一组的跳跃指针数据,发现其值为<5,pos1>,其中pos1指出了第二组的跳跃指针在倒排列表中的起始位置,于是可以解压缩pos1位置处连续两个数值,得到了<13,pos2>。跳跃指针的数值分别为5和13,分别表示两组数据中最小编号文档的文档ID,所以我们查找的文档一定在第一组中,否则说明倒排列表中不包含这个文档。于是就对第一组中的数据进行解压缩,并根据最小文档编号逆向恢复其原始的文档编号。而求两个查询词的倒排列表交集就是反复在两个倒排列表中查找某个文档是否存在,将同时存在两个倒排列表中的文档ID作为计算结果。

从上面的查找说明来看,相对不包含跳跃指针的索引来说,我们只需要对其中一个数据块进行解压缩和文档编号查找即可获得结果,不用将所有索引数据都进行解压缩和比较操作。很明显这加快了查找速度,提高了效率。

时间: 2024-11-03 22:23:15

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

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

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

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

索引的建立和更新 索引的建立 前一总结里说到,如果索引结构建立好了,可以提高搜索的速度,那么给定一个文档集合,索引是如何建立起来的呢?建立索引的方式有很多种,在这里我就书中提到的三种方法简单总结一下. 两遍文档遍历法 第一次文档遍历 第一次扫描文档集合时,并没有立即开始建立索引,而是收集一些的统计信息,比如文档集合包含的文档个数N.文档集合内包含的不同单词个数M以及每个单词在哪些文档中出现过的信息DF等等.将所有单词对应的DF值全部相加,就可以知道建立最终的索引需要多少内存了,然后在内存中将连续

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

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

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

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

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

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

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

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

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

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

悟道—位IT高管20年的职场心经(读书笔记六)

悟道--一位IT高管20年的职场心经 第七章  关于销售 用"最"来形容公司的销售,可以用上若干的词汇: 最牛,最累,最精,最傻,最有钱,最贱,最能吹,最能装... 1.1  销售人得基本素质 善胜者不争,善争者不战,善战者不败,善败者不乱. 五勤:嘴勤.腿勤.手勤(勤读勤记).耳目勤(多看多听).脑勤(勤思勤省). 能吃苦:身体之苦,巨大的心理压力. Not too hard, to be smarter! 1.2  销售VS前锋 最重要的是"临门一脚".拿下单子

IBatis.Net学习笔记六--再谈查询

在IBatis.Net学习笔记五--常用的查询方式 中我提到了一些IBatis.Net中的查询,特别是配置文件的写法. 后来通过大家的讨论,特别是Anders Cui 的提醒,又发现了其他的多表查询的方式.在上一篇文章中我提到了三种方式,都是各有利弊:第一种方式当数据关联很多的情况下,实体类会很复杂:第二种方式比较灵活,但是不太符合OO的思想(不过,可以适当使用):第三种方式最主要的问题就是性能不太理想,配置比较麻烦. 下面是第四种多表查询的方式,相对第二种多了一点配置,但是其他方面都很好(当然