首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
LoserFive
华南理工大学 C++
发布于北京
关注
已关注
取消关注
@承志Tech:
机器学习基础——倒排索引与搜索引擎
今天的文章,我们继续探讨搜索引擎,和大家聊聊搜索引擎最重要的一环——倒排索引。 在介绍倒排索引之前,我们先来看看什么是索引。索引是数据库当中的概念,维基百科中的说法是“数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据”。可以简单地把索引当成是字典里的检索目录,我们比如我们要查一个叫“index”的单词,通过目录,可以快速地找到字母i开始的位置。索引也是一样,不过我们查找的不再是单词的首字母,而是数据。 在之前介绍搜索引擎的文章当中,我们曾经说过,搜索引擎的爬虫爬取到网页的文本信息之后,会先进行分词,再进行存储。也就是说存储的不是完整的文档,而是文档当中的关键词信息。显然,搜索引擎当中包含的网页数量极为庞大,为了保证效率,我们必须要使用索引。 我们将每个网页称作是一个文档(document),为它准备一个文档Id,然后通过链表将文档当中的关键词串联起来。那么这个数据结构应该变成下面这个样子。 在这张图里面,我们通过文档的ID去查询文档当中包含的关键词信息。我们先查到对应的文档,再去查其中的id,这是一个符合我们日常思维的查询,所以被认为是一个“正向查询”。因此,这个索引结构被称为正向索引。 但是只有正向索引是不够的,比如用户搜索“北京大学”,我们可以拿到“北京”和“大学”两个关键词。我们希望的是可以通过这两个关键词检索出对应的文档,在这个时候,我们是不知道文档Id的。也就是说这是一个反向的查询,用字典做比喻,我们希望通过单词去查询它在词典当中的位置。 在我们只有正向索引的情况下,要做到这一点,我们必须遍历所有的文档,然后一一挑选出其中包含“北京”和“大学”关键词的文档。同样我们很容易明白,这是不可取的。所以为了解决这个问题,我们必须建立一个反向的索引,通过关键词指向文档。这样,我们就可以快速通过关键词筛选出对应的文档信息了。 这个反向的索引就是倒排索引。 有了倒排索引之后,剩下的就方便多了。我们就可以很方便地根据关键词召回所有含有关键词的文档,之后,再通过相应的算法计算各个文档与关键词之间的相关度,就可以进行相关性筛选了。这也是之前介绍搜索引擎的时候,提到的相关性过滤。 整个倒排索引的技术应该不难理解,不过实际操作的时候,要复杂一些, 还会涉及很多优化。下面就介绍众多优化方案当中,应用最广泛的一种。 ElasticSearch中的优化 说到倒排索引,不能不提ElasticSearch。ElasticSearch几乎可以说是全世界应用最广泛的开源搜索引擎了。从维基百科、GitHub再到百度、腾讯,以及无数的中小型公司,都离不开ElasticSearch的身影。它通过一套系统结合了搜索引擎、全文检索、结构化分析等众多功能,并且还有配置简单,性能出众等优点。 ElasticSearch身为分布式搜索引擎,巧妙的设计模式非常多,加上分布式系统本身的复杂性,可以研究的内容很多。今天这篇文章主要讲倒排索引,所以简单聊聊其中关于倒排索引的优化。 前文当中说了,我们通过对关键词设置倒排索引来达到关键词搜索的目的。从逻辑上看当然没有问题,但实际上问题不小。最大的问题就是这样的关键词实在是太多了,多还算了,而且这些关键词是没有顺序的,如果我们想要找到其中的某个,只能遍历所有的关键词表。这显然是我们不能接受的,这里必须要做优化。 一个最简单的优化就是对这些关键词进行排序,我们排序之后建立一个字典(dictionary)。有了dictionary之后,我们就可以通过二分查找一类的方式进行快速的搜索了。看似很完美,但还是有问题。 复杂度没有问题,O(logN)的复杂度是可以接受的,不能接受的是磁盘的读盘。因为这个dictionary实在是太大了,我们每次查找磁盘是需要开销的,每一次磁盘的随机读取需要消耗10ms的时间。对于一个高性能的系统来说,这同样是不能接受的。 我们要优化这个答案,就必须要减少磁盘的随机读取。 想要减少使用磁盘,最好的办法就是把数据放在内存里。但是我们前面说了,这个dictionary太大了,内存里很有可能放不下。所以我们必须再对它做简单的索引,比如: A字母开头的关键词存放在x页B字母开头的关键词存放在y页…… 这其实就是查字典的方法,问题是如果关键词都是英文的,当然可以这么做。然而,搜索引擎并不仅仅支持英文,关键词可能是各种语言,甚至是各种符号。而且即使是英文的,每个字母对应的索引的数量也不是相同的。比如s字母开头的单词特别多,而z开头的就非常少。如果这样简单操作,其实并不一定能提升运行效率。 所以为了解决这个问题,我们需要引入一个数据结构,即前缀树(Trie树)。 一棵前缀树大概长下面这个样子: 前缀树的原理并不难,其实就是把前缀相同的字符串映射到树上的同一个分叉当中。每个分叉的末端记录的是这个前缀对应的内容的位置。其实也就是说将原本扁平化存储的索引,映射到了树上。不过,前缀树当中并不会存储所有的索引,只会存储关键词的一些前缀。通过前缀,我们可以找到dictionary当中的某个位置,之后再从这个位置开始往后顺序查找,如此就避免了过多使用硬盘的随机寻址,从而节省了时间开销。 用下图举个例子: 比如我们要查找的关键词是“Access”,通过前缀树我们先查到A这个前缀对应的dictionary的位置,也就是图中的Ada的位置。之后我们从Ada往后顺序遍历,直到找到Access为止。通过合理地构建前缀树,我们可以控制遍历dictionary的开销,从而达到优化的目的。 除了这些之外,ElasticSearch还在联合索引的查询以及索引合并上做了一些优化。由于牵扯到一些其他的技术和数据结构,篇幅限制,这里不做过多赘述。会在之后的文章和大家分享。 如果觉得有所收获的,顺手点个关注吧~
点赞 1
评论 0
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
01-23 12:03
三一重能_C++研发工程师(准入职员工)
网易互娱内推,网易互娱内推码
网易互娱一面游戏用户运营岗,一面是业务面,少量有关简历的问题。自我介绍2-3分钟实习经历+收获,校园科研经历+获得的能力,体现出特色实习中有什么样的收获?同类型的问题有:实习中的挑战,最大的感触等,最后的落脚点可以落在通过这些挑战获得了什么的感触等对这个岗位的认识从用户运营的对象,手段,目的等方面入手,形成体系,回答会更有逻辑对回答到的几个流程有什么指标衡量?拉新:新增用户数。促活:日/周/月活跃用户、DAOT = 日总计在线时长/日活跃用户数。这是衡量游戏粘性的重要指标。留存:次日留存率,七日留存率等付费:付费渗透率等最近经常玩的游戏开始进入正题了,一定是特别了解或者提前了解过的游戏,网易游...
点赞
评论
收藏
分享
昨天 16:48
小红书_后端开发_REDstar算法工程师(准入职员工)
禾赛科技内推,禾赛科技内推码
禾赛科技 嵌入式开发(操作系统)面经⚜技术是真的过硬啊,秋招嵌入式被拷打的最狠之一。原定45分钟,拷打一个半小时,涉及知识面特别广,实际问的比这还要多,记忆有限。不过也无后续,但也没挂,估计在L3缓存里面吧⭕一面(9.18)1. 自我介绍2. 项目介绍3. 有没有测量IMU精度4. 串口有几根线,中断配置?5. IIC有几根线?讲一讲怎么通信?详细说一下读取寄存器的流程6. 说一说任务有哪几种状态?就绪和阻塞的任务放在哪里?放在同一个链表上面吗?7. 任务怎么进入阻塞态?(主动挂起,被强占,争取不到资源等)8. 说一说死锁?9. 怎么解决死锁问题?(获取不到锁的时候,释放本身的资源)10. 有...
点赞
评论
收藏
分享
2025-12-23 23:49
门头沟学院 前端工程师
原来前端已死是这个意思
双非前端已死 投一大圈一个面试约不到 我真心碎了 前端已死
程序员花海:
实习写的太偏项目了
点赞
评论
收藏
分享
01-04 11:28
已编辑
广州华立学院 Java
26届简历求拷打
打算明年参加春招,求各位佬们指点下简历
程序员花海:
实习内容写的看起来太偏向于技术了 要结合业务 很多同学搞反了 其实业务才是最重要的 要避免这种单纯罗列技术栈的格式
简历被挂麻了,求建议
点赞
评论
收藏
分享
01-26 21:41
清华大学 机械设计/制造
机械专业有这么不堪吗?
大家好,今天给大家分享一些对机械专业的观点。下面是不同机械人的经历及观点:网友1:玩意学的杂,老师的话就是机械里边啥也学点,学不精,但是好处是能搞机械控制嵌入式,能搞方向不少。网友2:二本机械真不行,我有个学长考研失败调剂回二本本校机械,现在毕业都找不到工作。网友3:计算机不是985.211硕士很难找工作,机械工很多,你可以看看校园招聘会,很多找机械的。网友4:现在还有机械不带电的,现在什么机械不往自动化上发展。整条生产线没有一个人,都是全自动化的。原来人的岗位都换机械臂和机器人了。网友5:劝退机械?谁有资格劝退工科之王,工科我只服电气在机械之上,其它都靠边。网友6:在国内一直是制造业大国机器...
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
牛客吐槽大会 | 有槽不吐,留着过年?吐完领现金红包,痛快!
2629
2
...
J人永远闲不下来于是去提前实习
2366
3
...
拥抱AI,程序员的最后出路
1696
4
...
mentor视角下的优秀实习生
1577
5
...
马斯克最新炸裂采访,AI会带走一半工作岗位,普通人将何去何从?
1546
6
...
大厂提前实习对AI开发的新感悟
1411
7
...
努力挣钱的意义具象化了
1371
8
...
真正会被取代的,是你心里面的幻觉
1360
9
...
去独角兽做龙头还是去大厂做凤尾
1231
10
...
我身材再曼妙,也没有我的工资好笑!
1154
创作者周榜
更多
正在热议
更多
#
牛客吐槽大会
#
1716次浏览
52人参与
#
机械人你知道哪些单休企业
#
82870次浏览
412人参与
#
今年春招是金一银二嘛?
#
6825次浏览
77人参与
#
没关系,至少我的__很曼妙
#
3404次浏览
62人参与
#
1月小结:你过的开心吗?
#
1551次浏览
50人参与
#
赚钱的意义在这一刻具象化
#
3598次浏览
90人参与
#
AI时代的工作 VS 传统时代的工作,有哪些不同?
#
7442次浏览
182人参与
#
抛开难度不谈,你最想去哪家公司?
#
3369次浏览
86人参与
#
为什么有人零实习也能进大厂?
#
4317次浏览
97人参与
#
你的landing期是如何度过的?
#
7658次浏览
144人参与
#
你的第一家实习公司是什么档次?
#
3712次浏览
65人参与
#
当你问AI“你会取代我的工作吗”,它说_?
#
3253次浏览
106人参与
#
参加完秋招的机械人,还参加春招吗?
#
103342次浏览
680人参与
#
机械人春招想让哪家公司来捞你?
#
379040次浏览
3138人参与
#
除了Java,最推荐学什么技术?
#
5191次浏览
133人参与
#
一人一道大厂面试题
#
114017次浏览
1263人参与
#
AI求职实录
#
2621次浏览
74人参与
#
你觉得什么岗位会被AI替代
#
36530次浏览
251人参与
#
在找工作求抱抱
#
1653684次浏览
10964人参与
#
哪些瞬间让你真切感受到了工作的乐趣
#
23187次浏览
100人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务