倒排索引和正排索引区别,什么是倒排索引
倒排索引和正排索引区别,什么是倒排索引那什么是倒排呢?「人如其名」,倒过来正排索引上图我们看到了倒排的轮廓:使用「关键词」代表「分组」。 那么为什么要这样做?这么做又为什么叫做「倒排」?什么是倒排 —— 字面解释先看看什么是正排,select * from answer where answer_id=1 。我们可以拿到 answer_id = 1 的所有信息:这就是正排。我们为某个文件、某条记录编号,通过这个编号可以拿到所需的信息:这就是正排的工作流程。
倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。 —— 维基百科
很多人应该都听说过「倒排」的概念,可以说全世界 100% 的网民都使用过「倒排」—— 搜索引擎的灵魂就是倒排。只要我们在使用 google、百度等等任何一款搜索(不管是不是干净搜索、不管有没有竞价排名),就肯定是倒排在为我们服务。
搜索「倒排」的结果
倒排工作原理:事先将爬虫拿到的网页数据根据「关键词」「分组」在一起;将用户请求的「关键词」,对应的「分组」返回给用户。
倒排系统如何服务于引擎上图我们看到了倒排的轮廓:使用「关键词」代表「分组」。 那么为什么要这样做?这么做又为什么叫做「倒排」?
什么是倒排 —— 字面解释
先看看什么是正排,select * from answer where answer_id=1 。我们可以拿到 answer_id = 1 的所有信息:这就是正排。我们为某个文件、某条记录编号,通过这个编号可以拿到所需的信息:这就是正排的工作流程。
正排索引
那什么是倒排呢?「人如其名」,倒过来
正排反过来就是倒排
那么,在什么情况下,我们会根据 content 获取它的 id 呢?理论上没有这种场景。当然,任何一个项目,也不会去维护这么一种索引关系(最起码 content 这个 key 实在太大了)。
但是,我们或许有这么一种场景:判断某个内容是不是已经被存到了库里 (比如防止一个 answer 重复提交)。试想我们可以用这种方案
md5 (content) 做 key
这样,我们其实是可以根据 content 信息拿到 id 的。
倒排的 hash 冲突
那么问题来了,假设真的会有 md5(content) = md5(content1),这个 key 就不唯一了。上面的情况就会变成
这时,我们可以根据 answer_id 的正排索引,获取 content 与 content1 ,辅助倒排系统验证功能。
这个过程是不是似曾相识?不错,这就是 HashMap 中解决 「hash 冲突」的经典思路。
倒排索引系统
根据业务需要,对内容选择适当的 hash 规则。将站内所有的内容,组织成的大的 HashMap 即为「倒排索引系统」。
Hash 大 Map
- 所谓的查询,就是 HashMap.get(XX) 获取 list
- 所谓的竞价排名,就是这个 list 根据 money 去排序
- 所谓的广告植入,就是这个广告本来不在 list 里面,然后被强插进去
- 。。。
搜索引擎的工作流程
倒排在 Feed 流中的使用
如上所示,倒排的工作:将站内数据 hash 化为一个大 map,服务用户请求其实是在 map 里查找数据。与引擎不同的是,Feed 流的只是倒排的 hash 函数不同。