文章插图
图3 哈希拉链法词典结构
在建立索引的过程中,词典结构也会相应地被构建出来 。比如在解析一个新文档的时候,对于某个在文档中出现的单词T,首先利用哈希函数获得其哈希值,之后根据哈希值对应的哈希表项读取其中保存的指针,就找到了对应的冲突链表 。如果冲突链表里已经存在这个单词,说明单词在之前解析的文档里已经出现过 。如果在冲突链表里没有发现这个单词,说明该单词是首次碰到,则将其加入冲突链表里 。通过这种方式,当文档集合内所有文档解析完毕时,相应的词典结构也就建立起来了 。
在响应用户查询请求时,其过程与建立词典类似,不同点在于即使词典里没出现过某个单词,也不会添加到词典内 。以图3为例,假设用户输入的查询请求为单词X,对这个单词进行哈希,定位到哈希表内的4号槽,从其保留的指针可以获得冲突链表,依次将单词X和冲突链表内的单词比较,发现单词X在冲突链表内,于是找到这个单词,之后可以读出这个单词对应的倒排列表来进行后续的工作,如果没有找到这个单词,说明文档集合内没有任何文档包含单词,则搜索结果为空 。
2)树形结构
B树(或者B+树)是另外一种高效查找结构,图1-8是一个 B树结构示意图 。B树与哈希方式查找不同,需要字典项能够按照大小排序(数字或者字符序),而哈希方式则无须数据满足此项要求 。
B树形成了层级查找结构,中间节点用于指出一定顺序范围的词典项目存储在哪个子树中,起到根据词典项比较大小进行导航的作用,最底层的叶子节点存储单词的地址信息,根据这个地址就可以提取出单词字符串 。
5. 倒排索引的实例
假设文档集合包含五个文档,每个文档内容如图4所示,在图中最左端一栏是每个文档对应的文档编号 。我们的任务就是对这个文档集合建立倒排索引 。
文章插图
图4 文档集合
中文和英文等语言不同,单词之间没有明确分隔符号,所以首先要用分词系统将文档自动切分成单词序列 。这样每个文档就转换为由单词序列构成的数据流,为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,在如此处理结束后,我们可以得到最简单的倒排索引(参考图3-4) 。在图3-4中,“单词ID”一栏记录了每个单词的单词编号,第二栏是对应的单词,第三栏即每个单词对应的倒排列表 。比如单词“谷歌”,其单词编号为1,倒排列表为{1,2,3,4,5},说明文档集合中每个文档都包含了这个单词 。
文章插图
图5 简单的倒排索引
之所以说图5所示倒排索引是最简单的,是因为这个索引系统只记载了哪些文档包含某个单词,而事实上,索引系统还可以记录除此之外的更多信息 。在单词对应的倒排列表中不仅记录了文档编号,还可以记载了单词频率信息(TF),即这个单词在某个文档中的出现次数,之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是很重要的一个计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算 实用的倒排索引还可以记载更多的信息,图6所示索引系统除了记录文档编号和单词频率信息外,额外记载了两类信息,即每个单词对应的“文档频率信息”(对应图6的第三栏) 。
文章插图
图6 带有单词频率、文档频率和出现位置信息的倒排索引
此外,除了上述信息,还可以在倒排列表中记录单词在某个文档出现的位置信息 。
图6所示倒排索引已经是一个非常完备的索引系统,实际搜索系统的索引结构基本如此,区别无非是采取哪些具体的数据结构来实现上述逻辑结构 。
有了这个索引系统,搜索引擎可以很方便地响应用户的查询,比如用户输入查询词“Facebook”,搜索系统查找倒排索引,从中可以读出包含这个单词的文档,这些文档就是提供给用户的搜索结果,而利用单词频率信息、文档频率信息即可以对这些候选搜索结果进行排序,计算文档和查询的相似性,按照相似性得分由高到低排序输出,最后为用户展示出搜索结果 。
推荐阅读
- 宣恩茶园推广绿色防虫技术 促进无公害茶生产
- 婺源县茶业局茶叶技术服务助力夏茶生产
- 推广茶叶机采技术 福鼎点头镇茶园开采茶青
- 昌宁强化茶叶技术推广工作 科技助力茶业发展
- 生物技术与原生态产品结合 青稞红曲茶热销
- 2019年终黑客工具盘点-推荐篇
- 57个用于搜索引擎优化的小技巧
- 华安,提高产茶技术水平 促茶业可持续发展
- 广东农科院茶研所博士传授博罗山茶种植技术
- 第三代半导体封装 第三代半导体封装技术