搜索引擎算法-倒排索引

由于公司需要从海量的视频资源中快速搜索到相关性高的视频,中间考虑过like的使用,由于需要取得多张表的资源并集,并进行like匹配还有其他条件的匹配,但是这样如果数据量上去的话,查询效率是极低的;然后,后面有同学提到使用维护倒排索引的方案解决,所以,特此查看此解决方案;在这个过程中,也有看到过使用mysql的全文索引解决mysql大数据量搜索的方案,但是,mysql全文索引针对大篇幅文档的搜索效果是好的,比较简短的文档,搜索效果可能一般,但是,秉着举一反三地思想,我们后面会开一篇mysql全文索引的文章。

[toc]

前言

介绍

倒排索引是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射,常被应用于搜索引擎和关键字查询的问题中。

见名知其意,有倒排索引(inverted index),就有正排索引(forward index),我们主要举例来看区别,加深理解。

以英文为例,下面是要被索引的文本:

T0 = "it is what it is"  
T1 = "what is it"  
T2 = "it is a banana"  

我们就能得到下面的反向文件索引:

"a":      {2}
"banana": {2}
"is":     {0, 1, 2}
"it":     {0, 1, 2}
"what":   {0, 1}

正向索引是用来存储每个文档的单词列表,即通过文档编号可以查询到关键字的集合;而反向索引则是通过关键词来找到关键词所在的文档,可以迅速定位到关键字对应的文档列表。

单词——文档矩阵

单词-文档矩阵是表达两者之间所具有的一种包含关系的概念模型
| 关键字/文档 | 文档1 | 文档2 | 文档3 | 文档4 |
|:———-:|:—–:|:—–:|:—–:|:—–:|
| 关键字1 | √ | | √ | |
| 关键字2 | | √ | | |
| 关键字3 | | √ | √ | |
| 关键字4 | √ | | | √ |
| 关键字5 | | √ | √ | |
| 关键字6 | √ | √ | | √ |

从纵向即文档维度来看,是每个文档包含了哪些关键字,即是正常的我们查询文档,可以查看关键字列表,如文档1中有关键词1,4,6;
从横向即关键字维度来看,是每个关键字在哪些文档中出现过,即是我们通过关键字快速查询到相关的文档,如关键字4在文档1,4中出现,快速定位到文档列表。

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

总结来看:

正排索引:文档编号到关键字的关联关系
倒排索引:关键字到文档编号的关联关系

倒排索引-查询过程

查询包含某关键字的文档

  1. 通过倒排索引获得某关键字对应的文档id列表
  2. 通过正排索引查询id列表对应文档的完整内容
  3. 返回最终结果

倒排索引-重要组成部分

  • 单词词典(Term Dictionary)
  • 倒排列表(PostingList)

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

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

单词词典-常用数据结构

  • 哈希加链表结构
  • 树形词典结构

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

关于这两种数据结构的介绍,请查看文章,在这里就不再重复了。

如何得到单词列表-分词

如何通过一篇大规模的文档得到我们的关键字词典,就需要用到分词技术,通常在创建文档和更新文档时来进行分词的操作。

关于分词的知识点请关注文章,介绍的很详细,关键是中文和英文分词的区别。

声明:感谢学习期间,各位博主文章的启发,特此声明本文章只做学习记录使用。
参考文档:

  1. 什么是倒排索引?
  2. Elasticsearch 6.x 倒排索引与分词

   转载规则


《搜索引擎算法-倒排索引》 Will 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
mysql全文索引 mysql全文索引
由前面倒排索引延申过来,做一个学习记录,方便以后使用到对大规模文档的关键字搜索服务。 [toc] 前言mysql索引类型 primary 唯一索引,不允许为null NORMAL 普通非唯一索引 UNIQUE 表示唯一的,不允许重复的索引
2018-09-13
下一篇 
gitlab搭建端口配置踩坑和ssh多账户配置解读 gitlab搭建端口配置踩坑和ssh多账户配置解读
因为公司刚开展新项目,之前都是使用的svn,现在转成git进行版本控制,虽然自己之前很久开始使用git,但是对于git的https和ssh两种传输方式只是一知半解,也造就了今天发时间去搞清楚这个东西,时间搭了,搞清楚也是值得的,对以后自己工
2018-07-03
  目录