Elasticsearch 与倒排索引

在搜索引擎中,数据被爬取后,就会建立index,方便检索。
在工作中经常会听到有人问,你这个index是正排的还是倒排的?那么什么是正排呢?什么又是倒排呢?下面是一些简单的介绍。

网页A中的内容片段:
Tom is a boy.
Tom is a student too.

网页B中的内容片段:
Jon works at school
Tom’s teacher is Jon.

1. 正排索引:

正排索引是指文档ID为key,表中记录每个关键词出现的次数,查找时扫描表中的每个文档中字的信息,直到找到所有包含查询关键字的文档。
假设网页A的局部文档ID是 TA, 网页B的局部文档ID是 TB。那么对TA进行正排索引建立的表结构是下面这样的:
在这里插入图片描述
从上面的介绍可以看出,正排是以 docid 作为索引的,但是在搜索的时候我们基本上都是用关键词来搜索。所以,试想一下,我们搜一个关键字(Tom),当100个网页的10个网页含有Tom这个关键字。但是由于是正排是doc id 作为索引的,所以我们不得不把100个网页都扫描一遍,然后找出其中含有Tom的10个网页。然后再进行rank,sort等。效率就比较低了。尤其当现在网络上的网页数已经远远超过亿这个数量后,这种方式现在并不适合作为搜索的依赖。

不过与之相比的是,正排这种模式容易维护。由于是采用doc 作为key来存储的,所以新增网页的时候,只要在末尾新增一个key,然后把词、词出现的频率和位置信息分析完成后就可以使用了。

所有正排的优点是:易维护;缺点是搜索的耗时太长

2. 倒排索引:

由于正排的耗时太长缺点,倒排就正好相反,是以word作为关键索引。表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置情况。

倒排包含两部分:

  • 单词词典(Term Dictionary), 记录所有文档的单词,记录单词到倒排列表的关联关系。单词词典一般比较大,可以通过B+树或哈希拉链法实现,以满足高性能的插入与查询。
  • 倒排列表(Posting List),记录了单词对应的文档结合,由倒排索引项组成。倒排列表由以下4项组成:
    1. 文档ID
    2. 词频TF,该单词再文档中出现的次数,用于相关性评分
    3. 位置(Position),单词在文档中分词的位置,用于语句搜索(phrase query)
    4. 偏移(Offset), 记录单词的开始结束位置, 实现高亮显示

在这里插入图片描述
倒排的优缺点和正排的优缺点整好相反。倒排在构建索引的时候较为耗时且维护成本较高,但是搜索耗时短。

3. 参考文档

https://blog.csdn.net/hxyascx/article/details/98482355
https://blog.csdn.net/zhangzeyuaaa/article/details/48676775
https://blog.csdn.net/GarfieldEr007/article/details/50479074
https://zh.wikipedia.org/zh-hans/%E5%80%92%E6%8E%92%E7%B4%A2%E5%BC%95
https://riteme.github.io/blog/2016-11-29/delta-and-stirling.html(差分序列)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值