面试被问到 [倒排索引] 不知道怎么办?这篇文章告诉你

倒排索引

文章目录

  • 倒排索引
    • 官方定义
    • 工作原理
    • 何为倒排
    • 倒排的 hash 冲突
    • 生成倒排索引的过程
    • 倒排索引系统

官方定义

倒排索引(英语:Invertedindex),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。
—— 维基百科

很多人应该都听说过「倒排」的概念,可以说全世界 100% 的网民都使用过「倒排」—— 搜索引擎的灵魂就是倒排。只要我们在使用 google、百度等等任何一款搜索(不管是不是干净搜索、不管有没有竞价排名),就肯定是倒排在为我们服务。

工作原理

倒排工作原理:事先将爬虫拿到的网页数据根据「关键词」「分组」在一起;将用户请求的「关键词」,对应的「分组」返回给用户

面试被问到 [倒排索引] 不知道怎么办?这篇文章告诉你_第1张图片

何为倒排

你也许会想什么是正排,举个例子

select * from answer where answer_id=1

可以拿到 answer_id = 1 的所有信息,这就是正排。
我们为某个文件、某条记录编号,通过这个编号可以拿到所需的信息:这就是正排的工作流程。
在这里插入图片描述
那么什么是倒排呢?「人如其名」,倒过来

在这里插入图片描述
那么,在什么情况下,会根据 content 获取它的 id 呢?理论上没有这种场景。当然,任何一个项目,也不会去维护这么一种索引关系(最起码 content 这个 key 实在太大了)。
但或许有这么一种场景:判断某个内容是不是已经被存到了库里 (比如防止一个 answer 重复提交)。试想我们可以用这种方案
在这里插入图片描述
这样,我们其实是可以根据 content 信息拿到 id 的。

倒排的 hash 冲突

那么问题来了,假设真的会有 md5(content) = md5(content1),这个 key 就不唯一了。上面的情况就会变成
在这里插入图片描述
这时,我们可以根据 answer_id 的正排索引,获取 content 与 content1 ,辅助倒排系统验证功能。

这个过程是不是似曾相识?不错,这就是 HashMap 中解决 「hash 冲突」的经典思路。

生成倒排索引的过程

  • 文本分词:将文档进行分词,将文本切分为一个个单词。
  • 建立索引:对于每个单词,将其与文档ID进行映射,可以使用哈希表、字典或者树等数据结构来存储这种映射关系。
  • 压缩索引:为了减少倒排索引的存储空间,可以考虑使用压缩算法对索引进行压缩。

倒排索引系统

根据业务需要,对内容选择适当的 hash 规则。将站内所有的内容,组织成的大的 HashMap 即为「倒排索引系统」。在倒排索引中,每个单词都会被映射到一个或多个文档的ID上。这种方式使得我们可以根据单词快速地找到包含该单词的文档。

放到日常生活中:

  • 所谓的查询,就是 HashMap.get(XX) 获取 list
  • 所谓的竞价排名,就是这个 list 根据 money 去排序
  • 所谓的广告植入,就是这个广告本来不在 list 里面,然后被强插进去

你可能感兴趣的:(Java后端开发面试,面试,倒排索引)