搜索引擎基础概念(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java学习(20):巩固练习

//用运算符判断2019是不是闰年 /①、普通年能被4整除且不能被100整除的为闰年。 &#xff08;如2004年就是闰年,1901年不是闰年&#xff09;地球公转示意图②、世纪年能被400整除的是闰年。 (如2000年是闰年&#xff0c;1900年不是闰年) ③、 对于数值很大的年份能整除3200,但同…

PHP与MySQL案例剖析_PHP与MySQL案例剖析

第1章 简介1.1 从静态到动态站点1.1.1 静态Web站点1.1.2 动态Web站点1.1.3 什么是开放源码1.2 关于PHP1.3 关于MySQL1.3.1 在哪里获得MySQL和文档1.3.2 MySQL特性1.3.3 如何安装MySQL和PHP1.3.4 MySQL和PHP的优点1.4 本章小结1.4.1 应该掌握的内容1.4.2 下一步第…

crud介绍

什么是CRUD&#xff1f; CRUD的操作 CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。主要被用在描述软件系统中DataBase或者持久层的基本操作功能。 数据库CRUD操作 一、删除表 drop table 表名称 二、修改表…

汇编软件的安装与实验一

软件的安装在课程邮箱里有详尽的介绍&#xff0c;但在安装调试的时候还是出了一点小问题&#xff0c;创建虚拟盘符的时候&#xff0c;我将masm文件夹前面套上了一层名为masm文件夹&#xff0c;导致虚拟盘符创建之后无法使用debug。 随后就是实验 实验1.1写入程序段并且执行 a命…

python3.6 websocket异步高并发_在Python3.6上的websocket客户端中侦听传入消息时出现问题...

我正在尝试使用websockets包在Python上构建一个websockets客户端&#xff1a;Websockets 4.0 API我使用这种方式而不是示例代码&#xff0c;因为我想创建一个websocket客户机类对象&#xff0c;并将其用作网关。在我在客户端的侦听器方法(receiveMessage)有问题&#xff0c;这会…

upc 9519 New Game

New Game 时间限制: 1 Sec 内存限制: 128 MB Special Judge提交: 157 解决: 53[提交] [状态] [讨论版] [命题人:admin]题目描述 Eagle Jump公司正在开发一款新的游戏。泷本一二三作为其员工&#xff0c;获得了提前试玩的机会。现在她正在试图通过一个迷宫。这个迷宫有一些特…

java学习(21):移位运算符

//移位运算符 public class test{ public static void main(String[] args){ int num3; //向左移位 System.out.println(“移位之前的二进制为”Integer.toBinaryString(num)); int moveleftnum<<2; System.out.println(“移位之后的值为”moveleft); //向右移位 int num…

Datagridview绘制

#region 绘制private void dataGridView_main_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e){int status_column_index 14;//会诊状态所在列DataGridViewRow row dataGridView_main.Rows[e.RowIndex];//获取行DataGridViewCell cell row.Cells[15];//按钮…

java学习(22):if语句

/任务 1&#xff1a;if语句 编写控制台java程序&#xff0c;使用Scanner 对象相关方法从控制台接收用户输入学生年龄&#xff0c; 如果输入的年龄大于18&#xff0c;则输出“你是一个成年人了&#xff0c;该有担当了&#xff01;/ import java.util.Scanner; public class test…

ansible管理mysql安装初始化_[ansible]-ansible初始化mysql数据库

0.目录结构$ tree mysqlmysql├── files│ └── web.sql├── handlers│ └── main.yml├── tasks│ └── main.yml├── templates│ ├── client.cnf.j2│ ├── my.cnf.j2│ ├── mysql-clients.cnf.j2│ └── server.cnf.j2└── vars1…

利用expect实现自动化操作

管理机上需要安装expect包 yum -y install expect1.定义主机ip[rootlocalhost ~]# cat ip.txt 192.168.1.12 192.168.1.132.定义脚本内容[rootlocalhost ~]# cat script.sh vmstat3、shell嵌套expect脚本[rootlocalhost ~]# cat command.sh #!/bin/bashpasswd12345678 sc$(ca…

java学习(23):if..else

/任务2&#xff1a;if else 语句 编写控制台java程序&#xff0c;模拟银行取款的功能。 使用Scanner对象相关方法从控制台接收用户输入的银行卡账号和密码&#xff0c; 与预先定义好的银行卡账号密码相同则输出用户名密码正确&#xff0c;可以取款&#xff1b;如果账号或者密码…

word导入mysql表格_数据插入Word 表格步骤

数据插入Word 表格步骤数据插入Word 表格步骤(1)单击【数据库】工具栏上的【插入数据库】按钮&#xff0c;出现【数 据库】对话框&#xff0c;如图4-33 所示。(2)单击【获取数据】按钮&#xff0c;弹出【选择数据源】对话框&#xff0c;类 似于打开文档窗口。(3)选定合适的.数据…

android 面试汇总二

AnimationQ&#xff1a;Android中有哪几种类型的动画&#xff1f; 技术点&#xff1a;动画类型参考回答&#xff1a; 常见三类动画 View动画&#xff08;View Animation&#xff09;/补间动画&#xff08;Tween animation&#xff09;&#xff1a;对View进行平移、缩放、旋转和…

java学习(24):if..else...if

/任务3&#xff1a;if… else if…. else if….else语句 编写控制台java程序&#xff0c;模拟根据有多少钱买车的功能。 使用Scanner对象相关方法从控制台接收用户输入有多少钱&#xff0c; 单位为万。如果输入的钱数量大于等于100万&#xff0c;则输出“可以买奔驰” &#xf…

废粉盒在哪里_很想知道打印机废粉盒中的那些废碳粉应该怎么处理?

激光打印机用磁性调色剂(碳粉)的主要成分&#xff1a;F-Fe3O4晶体粉粒(PLGMENT)&#xff1a;占20-30%聚丙烯酸脂-苯乙烯共聚物&#xff1a;占50-60%电荷调节剂CCA&#xff1a;占10-20%流动化剂SiO2等表面改性剂聚乙烯/聚丙烯石蜡二、碳粉的无毒性控制碳粉的各种原材料若是标准化…

java学习(25):三目运算符

/任务4&#xff1a;三目运算符 编写控制台java程序&#xff0c; 使用Scanner对象相关方法从控制台接收两个整数&#xff0c;比较他们的大小/ import java.util.Scanner; public class test04{ public static void main(String[] args){ Scanner in new Scanner(System.in); Sys…

前端必须懂的计算机网络知识—(跨域、代理、本地存储)(掘金)

1.同源策略与跨域&#xff1a;浏览器只对网络请求有同源限制&#xff0c;同源就是协议、域名和端口号一致&#xff0c;不同源的客户端脚本在没有明确授权的情况下&#xff0c;不能读写对方XHR资源&#xff0c;反之不同源脚本读取对方XHR资源就是跨域。 转载于:https://www.cnbl…

程序安装mysql数据库_安装Mysql数据库

1.安装Mysql数据库①下载Mysql数据包wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz②在/usr/local/src下解压缩文件包tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz③将解压后的文件包改名为mysqlmv mysql-5.6.35-linux-gli…

java学习(26):switch

/扩展练习&#xff1a; 任务5&#xff1a;switch语句 编写控制台Java程序&#xff0c;使用Scanner对象相关方法接收用户输入的年份和月份&#xff0c; 输出这个月有多少天。(提示:闰年计算方法为&#xff1a;能被4整除单不能被100整除&#xff1b;或者能被400整除就是闰年。)/ …