搜索引擎基础概念(1)——倒排索引

  “ 吾有三剑,唯子所择;皆不能杀人,且先言其状。一曰含光,视之不可见,运之不知有。其所触也,泯然无际,经物而物不觉。二曰承影,将旦昧爽之交,日夕昏明之际,北面而察之,淡淡焉若有物存,莫识其状。其所触也,窃窃然有声,经物而物不疾也。三曰宵练,方昼则见影而不见光,方夜见光而不见形。其触物也,騞然而过,随过随合,觉疾而不血刃焉。此三宝者,传之十三世矣,而无施于事。匣而藏之,未尝启封。”   —— 《列子·汤问》

  倒排索引(Inverted Index):倒排索引是搜索引擎数据存储的结构与形式,是实现单词-文档矩阵的一种具体存储形式。通过倒排索引,我们可以根据单词快速的获取包含这个单词的文档列表。倒排索引主要由两个部分组成:单词词典和倒排文件。

  一:单词-文档矩阵

    单词-文档矩阵是表达单词与文档之间所具有的一种包含关系的概念模型,图1-1展示了其含义。图1-1每列代表一个文档,每行代表一个单词,打对勾的位置代表包含关系。

                       

                                    图1-1 单词-文档矩阵

    从纵向即文档这个维度来看,每列代表了该文档包含了哪些单词,比如文档1包含了词汇1和词汇4,而不包含其他单词。从横向即单词这个维度来看,每行代表了哪些文档包含了这个单词。比如对于词汇1来说,文档1和文档4包含了词汇1,而其他文档不包含词汇1。矩阵中其他行列亦可作此解读。

    搜索引擎的索引其实就是实现了单词-文档矩阵的具体数据结构。可以有不同的方式来实现上述概念模型,比如倒排索引、签名文件、后缀树等方式。但是各项实验数据表明,倒排索引是单词到文档影身关系最佳实现方式。

   
  二:倒排索引基本概念

  • 文档(Document):一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象。相比网页来说,涵盖更多形式,比如 Word、PDF、html、XML、关系型数据库的一条记录等不同格式的文件都可以称为文档,再比如一封邮件、一条短信、一条微博也可以称为文档。
  • 文档集合(Document Collection):由若干文档构成的集合称为文档集合。比如海量的互联网网页或者说大量的电子邮件或者说一批关系型数据库数据,都是文档集合的具体例子。
  • 文档编号(Document ID):在搜索引擎内部,会为文档集合内每个文档赋予一个唯一的内部编号,以此编号来作为这个文档的唯一标识,这样方便内部处理。每个文档的内部编号即称为文档编号,后面会用 DocID 来便捷地代表文档编号。
  • 单词编号(Word ID):与文档编号类似,搜索引擎内部以唯一的编号来表征某个单词,单词编号可以作为某个单词的唯一表征。
  • 倒排索引(Inverted Index):倒排索引是实现单词—文档矩阵的一种具体存储形式。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:单词词典和倒排文件。
  • 单词词典(Lexicon):搜索引擎通常的索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息及指向倒排列表的指针。
  • 倒排列表(PostingList):倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。
  • 倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称为倒排文件,倒排文件是存储倒排索引的物理文件。

    关于这些概念以及之间的关系,图1-2可以清晰的看出来:

                      

  三:倒排索引简单实例

    倒排索引从逻辑结构和基本思路上讲非常简单。下面我们通过具体实例来进行说明。

    假设文档集合包含 5 个文档,每个文档内容如图 1-3 所示,在图中最左端一栏是每个文档对应的文档编号,我们的任务就是对这个文档集合建立倒排索引。

                    

                               图1-3 文档集合

    中文和英文等语言不同,单词之间没有明确的分隔符号,所以首先要用分词系统将文档自动切分成单词序列,这样每个文档就转换为由单词序列构成的数据流。为了系统后续处理方便, 需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,在如此处理结束后,我们可以得到最简单的倒排索引(参考图 1-4)。在图 1-4 中,“单词 ID”一列记录了每个单词的单词编号,第 2 列是对应的单词,第 3 列即每个单词对应的倒排列表。比如单词“谷歌”,其单词编号为 1,倒排列表为{1,2,3,4,5},说明文档集合中每个文档都包含了这个单词。

                    

                             图1-4   最简单的倒排索引

    之所以说图 1-4 所示的倒排索引是最简单的,是因为这个索引系统只记载了哪些文档包含某个单词,而事实上,索引系统还可以记录除此之外的更多信息。图 1-5 是一个相对复杂些的倒排索引,与图 1-4 所示的基本索引系统相比,在单词对应的倒排列表中不仅记录了文档编号,还记载了单词频率信息(TF),即这个单词在某个文档中出现的次数,之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是一个很重要的计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算。在图 1-5 所示的例子里, 单词“创始人”的单词编号为 7,对应的倒排列表内容有(3;1),其中 3 代表文档编号为 3 的文档包含这个单词,数字 1 代表词频信息,即这个单词在 3 号文档中只出现过 1 次,其他 单词对应的倒排列表所代表的含义与此相同。

                    

                              图1-5 带有单词词频信息的倒排索引

    实际的倒排索引还可以记载更多的信息,如图 1-6 所示的索引系统除了记录文档编号和单词频率信息外,额外记载了两类信息,即每个单词对应的文档频率信息(对应图 1-6 的第 3 列) 及单词在某个文档出现位置的信息。

                  

                        图1-6 带有单词频率、文档频率和出现位置信息的倒排索引

    文档频率信息代表了在文档集合中有多少个文档包含某个单词,之所以要记录这个信息,其原因与单词频率信息一样,这个信息在搜索结果排序计算中是一个非常重要的因子。而单词在某个文档中出现位置的信息并非索引系统一定要记录的,在实际的索引系统里可以包含,也可以选择不包含这个信息,之所以如此是因为这个信息对于搜索系统来说并非必需,位置信息只有在支持短语查询的时候才能够派上用场。

    以单词“拉斯”为例,其单词编号为 8,文档频率为 2,代表整个文档集合中有两个文档包含 这个单词,对应的倒排列表为{(3;1;<4>),(5;1;<4>)},其含义为在文档 3 和文档 5 出现过这个 单词,单词频率都为 1,单词“拉斯”在两个文档中的出现位置都是 4,即文档中第 4 个单词 是“拉斯”。

    如图 1-6 所示的倒排索引已经是一个非常完备的索引系统,实际搜索系统的索引结构基本如此,区别无非是采取哪些具体的数据结构来实现上述逻辑结构。

    有了这个索引系统,搜索引擎可以很方便地响应用户的查询,比如用户输入查询词 “Facebook”,搜索系统查找倒排索引,从中可以读出包含这个单词的文档,这些文档就是提供给用户的搜索结果,而利用单词频率信息、文档频率信息即可对这些候选搜索结果进行排序,计算文档和查询的相似性,按照相似性得分由高到低排序输出,此即为搜索系统的部分内部流程,具体实现方案本书第 5 章会做详细描述。

原文地址:https://www.cnblogs.com/yaokaizhi/p/9742290.html

时间: 2024-11-13 10:17:08

搜索引擎基础概念(1)——倒排索引的相关文章

搜索引擎基础概念(2)—— 构建单词词典

Lucene单词词典 使用lucene进行查询不可避免都会使用到其提供的单词词典功能,即根据给定的term找到该term所对应的倒排文档id列表等信息.实际上lucene索引文件后缀名为tim和tip的文件实现的就是lucene的单词词典功能. 怎么实现一个单词词典呢?我们马上想到排序数组,即term字典是一个已经按字母顺序排序好的数组,数组每一项存放着term和对应的倒排文档id列表.每次载入索引的时候只要将term数组载入内存,通过二分查找即可.这种方法查询时间复杂度为Log(N),N指的是

搜索引擎基础概念(3)—— 倒排列表

倒排列表 倒排列表用来记录有哪些文档包含了某个单词.一般在文档集合里会有很多文档包含某个单词,每个文档 会记录文档编号(DocID),单词在这个文档中出现的次数(TF)及单词在文档中哪些位置出现过等信息,这样与一个文档相关的信息被称做倒排索引项(Posting),包含这个单词的一 系列倒排索引项形成了列表结构,这就是某个单词对应的倒排列表.图 1-1 是倒排列表的示意图,在文档集合中出现过的所有单词及其对应的倒排列表组成了倒排索引. 图1-1 倒排列表示意图 在实际的搜索引擎系统中,并不存储倒排

伯克利教授Stuart Russell:人工智能基础概念与34个误区

伯克利教授Stuart Russell:人工智能基础概念与34个误区 机器之心 9 个月前 机器之心 Russell 是加州大学伯克利分校人工智能系统中心创始人兼计算机科学专业教授,同时还是人工智能领域里「标准教科书」<人工智能:一种现代方法>作者(谷歌研究主管 Peter Norvig 也是该书作者).在这篇文章中,他以 Q&A 的方式讲解了人工智能的未来以及常见的误解. 1. 什么是人工智能? 是对让计算机展现出智慧的方法的研究.计算机在获得正确方向后可以高效工作,在这里,正确的方

【搜索引擎基础知识3】搜索引擎相关开源项目及网站

部分内容转自:http://blog.csdn.net/hguisu/article/details/8024799 一. 开源项目 1.Lucene全文检索系统 http://lucene.apache.org和 http://www.lucene.com.cn/ Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文

关系型数据库常用基础概念知识归纳

声明:我的文章都是只挑主要的写,次要细节太多,归纳就没意义了,同时归纳主要是给自己看的, 而且基本都是凭自己的一些记忆和理解即时写的.不一定对和全(但大多是一些需要理解的概念),请各位看管见谅! 数据库设计篇 1.范式 A.1范式,原子性,即列不可分 B.2范式,完全依赖,即有个主键唯一区分 C.3范式,不能传递依赖,即表中不能还有其他表的非主键信息 2.模型 A.概念模型,即ER图等 B.逻辑模型,即建逻辑表 C.物理模型,即生成物理表 事务 1.四大特性, A.原子,要么..要么.. B.隔

分布式学习——基础概念篇

概述 最近这段时间一直在看分布式有关的东西,但是关于分布式自己还是不能很好的理解,所以本文对分布式基础概念进行下学习. 分布式处理 首先先了解一下分布式处理,分布式处理和集中式处理正好是相反的的体系架构,集中传输集中到式处理顾名思义就是将所有的信息都一个统一的信息中心进行处理:分布式处理就是将不同地点的,或具有不同功能的,或拥有不同数据的多台计算机利用通信网络连接起来,让各个计算机各自承担同一个工作任务的不同部分,在控制中心的管理下,同时运行,共同完成同一个工作任务. 提到分布式处理就不能不提到

js基础--javascript基础概念之语法

掌握一门语言 必须先掌握它的语法! javascript 的语法和C.Java.Perl 的语法有些相似.但是比它们更加宽松. javascript 中的一切都是严格区分大小写的.例如变量: demo 和 Demo 两个变量是完全不同的. javascript 标示符,所谓标示符 是指 变量.函数.属性 的名字或函数的参数.标示符的格式是按照以下规则组合的一个或多个字符. 1.第一个字符必须是字母,下划线,或 $ 符号. 2.其他字符可以是字母.下划线.$ . 或数字. 注意 不能把关键字 保留

js基础--javascript基础概念之数组(二)

js基础--javascript基础概念之数组 数组栈方法 数组可以像栈一样.栈是一种先进后出的数据结构,最先添加的数据最后一个出来.栈方法添加数据也称为 推入  移除数据称为 弹出. js为数值栈方法提供了 push()   和  pop() ;  两个方法. push() push() 方法接受参数就是你要添加进入到数组的值.push()  方法会将他们逐一添加到数组的末尾  数组的length属性会跟着更新数据. *push(多个数组元素值) 返回的修改后的数组长度 var array =

js基础--javascript基础概念之数组

js基础--javascript基础概念之数组 在ECMAScript 中 ,数组是很常用的数据类型,js中的数组和其他很多语言的数组有明显的区别.js的数组可以保持任何类型的数值,一个数组中可以保存着多个不同类型的数值.js数组大小(长度)是可以调整的.可以随着数据的添加自动增长数组长度. 创建数组: 一.数组字面量 数组字面量由一对包含数组项的方括号[]表示. var array = [ 'kin', 'cheong', 'change', 'hello', 'haha', 'hi' ];