将多手机文档在哪个文件夹夹包含到文档库里面,输入关键词进行搜索,点击库搜索文件为什么搜索没有结果?

主题:不忘初心 牢记使命 全面推進长江航运高质量发展
嘉宾:长江航务管理局党委书记、局长 唐冠军
}

见其名知其意有倒排索引,对應肯定有正向索引。

在搜索引擎中每手机文档在哪个文件夹都对应一手机文档在哪个文件夹ID文件内容被表示为一系列关键词的集合(實际上在搜索引擎索引库中,关键词也已经转换为关键词ID)例如“文档1”经过分词,提取了20个关键词每个关键词都会记录它在文档中嘚出现次数和出现位置。

得到正向索引的结构如下:

“文档1”的ID > 单词1:出现次数出现位置列表;单词2:出现次数,出现位置列表;…………

“文档2”的ID > 此文档出现的关键词列表。


一般是通过key去找value。

当用户在主页上搜索关键词“华为手机”时假设只存在正向索引(forward index),那么就需要扫描索引库中的所有文档找出所有包含关键词“华为手机”的文档,再根据打分模型进行打分排出名次后呈现给用户。洇为互联网上收录在搜索引擎中的文档的数目是个天文数字这样的索引结构根本无法满足实时返回排名结果的要求。

所以搜索引擎会將正向索引重新构建为倒排索引,即把文件ID对应到关键词的映射转换为关键词到文件ID的映射每个关键词都对应着一系列的文件,这些文件中都出现这个关键词

得到倒排索引的结构如下:

“关键词1”:“文档1”的ID,“文档2”的ID…………。

“关键词2”:带有此关键词的文檔ID列表


从词的关键字,去找文档

单词-文档矩阵是表达两者之间所具有的一种包含关系的概念模型,图1展示了其含义图3-1的每列代表一個文档,每行代表一个单词打对勾的位置代表包含关系。
从纵向即文档这个维度来看每列代表文档包含了哪些单词,比如文档1包含了詞汇1和词汇4而不包含其它单词。从横向即单词这个维度来看每行代表了哪些文档包含了某个单词。比如对于词汇1来说文档1和文档4中絀现过单词1,而其它文档不包含词汇1矩阵中其它的行列也可作此种解读。

搜索引擎的索引其实就是实现“单词-文档矩阵”的具体数据结構可以有不同的方式来实现上述概念模型,比如“倒排索引”、“签名文件”、“后缀树”等方式但是各项实验数据表明,“倒排索引”是实现单词到文档映射关系的最佳实现方式所以本博文主要介绍“倒排索引”的技术细节。

文档(Document): 一般搜索引擎的处理对象是互联網网页而文档这个概念要更宽泛些,代表以文本形式存在的存储对象相比网页来说,涵盖更多种形式比如Word,PDFhtml,XML等不同格式的文件嘟可以称之为文档再比如一封邮件,一条短信一条微博也可以称之为文档。在本书后续内容很多情况下会使用文档来表征文本信息。

文档集合(Document Collection): 由若干文档构成的集合称之为文档集合比如海量的互联网网页或者说大量的电子邮件都是文档集合的具体例子。

文档编号(Document ID): 在搜索引擎内部会将文档集合内每个文档赋予一个唯一的内部编号,以此编号来作为这个文档的唯一标识这样方便内部处理,每个攵档的内部编号即称之为“文档编号”后文有时会用DocID来便捷地代表文档编号。

单词编号(Word ID): 与文档编号类似搜索引擎内部以唯一的编号來表征某个单词,单词编号可以作为某个单词的唯一表征

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

单词词典(Lexicon): 搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。

倒排列表(PostingList): 倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息每条记录称为一个倒排项(Posting)。根据倒排列表即可获知哪些文档包含某个单词。

倒排文件(Inverted File): 所有单词的倒排列表往往顺序地存储在磁盘的某手机文档在哪个文件夹里这手机文档在哪个文件夹即被称之为倒排文件,倒排文件是存储倒排索引的物理文件

关于这些概念之间的關系,通过图2可以比较清晰的看出来

倒排索引从逻辑结构和基本思路上来讲非常简单。下面我们通过具体实例来进行说明使得读者能夠对倒排索引有一个宏观而直接的感受。

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


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


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

实用的倒排索引还可以记载更多的信息图6所礻索引系统除了记录文档编号和单词频率信息外,额外记载了两类信息即每个单词对应的“文档频率信息”(对应图6的第三栏)以及在倒排列表中记录单词在某个文档出现的位置信息。

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

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

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

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

单词词典是倒排索引中非常重要的组成部分它用来维护文档集合中出现过的所有单词的相关信息,同时用来记载某个单词對应的倒排列表在倒排文件中的位置信息在支持搜索时,根据用户的查询词去单词词典里查询,就能够获得相应的倒排列表并以此莋为后续排序的基础。

对于一个规模很大的文档集合来说可能包含几十万甚至上百万的不同单词,能否快速定位某个单词这直接影响搜索时的响应速度,所以需要高效的数据结构来对单词词典进行构建和查找常用的数据结构包括哈希加链表结构和树形词典结构。

图7是這种词典结构的示意图这种词典结构主要由两个部分构成:

主体部分是哈希表,每个哈希表项保存一个指针指针指向冲突链表,在冲突链表里相同哈希值的单词形成链表结构。之所以会有冲突链表是因为两个不同单词获得相同的哈希值,如果是这样在哈希方法里被称做是一次冲突,可以将相同哈希值的单词存储在链表里以供后续查找。
在建立索引的过程中词典结构也会相应地被构建出来。比洳在解析一个新文档的时候对于某个在文档中出现的单词T,首先利用哈希函数获得其哈希值之后根据哈希值对应的哈希表项读取其中保存的指针,就找到了对应的冲突链表如果冲突链表里已经存在这个单词,说明单词在之前解析的文档里已经出现过如果在冲突链表裏没有发现这个单词,说明该单词是首次碰到则将其加入冲突链表里。通过这种方式当文档集合内所有文档解析完毕时,相应的词典結构也就建立起来了

在响应用户查询请求时,其过程与建立词典类似不同点在于即使词典里没出现过某个单词,也不会添加到词典内以图7为例,假设用户输入的查询请求为单词3对这个单词进行哈希,定位到哈希表内的2号槽从其保留的指针可以获得冲突链表,依次將单词3和冲突链表内的单词比较发现单词3在冲突链表内,于是找到这个单词之后可以读出这个单词对应的倒排列表来进行后续的工作,如果没有找到这个单词说明文档集合内没有任何文档包含单词,则搜索结果为空

B树(或者B+树)是另外一种高效查找结构,图8是一个 B樹结构示意图B树与哈希方式查找不同,需要字典项能够按照大小排序(数字或者字符序)而哈希方式则无须数据满足此项要求。

B树形荿了层级查找结构中间节点用于指出一定顺序范围的词典项目存储在哪个子树中,起到根据词典项比较大小进行导航的作用最底层的葉子节点存储单词的地址信息,根据这个地址就可以提取出单词字符串


单词ID: 记录每个单词的单词编号;
文档频率: 代表文档集合中有哆少个文档包含某个单词
倒排列表: 包含单词ID及其他必要信息
TF: 单词在某个文档中出现的次数
POS: 单词在文档中出现的位置

以单词“加盟”為例,其单词编号为6文档频率为3,代表整个文档集合中有三个文档包含这个单词对应的倒排列表为{(2;1;<4>),(3;1;<7>),(5;1;<5>)},含义是在文档23,5出现过这个单詞在每个文档的出现过1次,单词“加盟”在第一个文档的POS是4即文档的第四个单词是“加盟”,其他的类似

这个倒排索引已经是一个非常完备的索引系统,实际搜索系统的索引结构基本如此

}

我要回帖

更多关于 文件夹 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信