首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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-26 20:09
西安邮电大学 后端工程师
大厂的后端需求流程是什么样的?
一句话总结:先看这个需求是否合理:需求评审会,再看这个需求给谁做:排期,那你打算怎么做:技术评审,做的怎么样:code review,测试介入。发布这个需求:上线需求评审会:这个实习生都不一定能参与,其实就是产品提完需求之后,大家一起聊一下这个需求的合理性,可行性和价值。一起对其一下对这个项目的理解。排期:看谁最近手里有空闲时间,就把这个需求给谁做。大厂内部都有一个类似日历的东西,相当于需求的时间管理表。你要和各个同学,比如产品,前端,测试协调好时间。比如你说你1.6-1.9预估完成这个需求,那前端是不是预估1.9-1.10完成前端需求?测试是不是预估1.10-1.11完成这个需求?技术评审:...
代码之外的生存之道
点赞
评论
收藏
分享
01-26 15:51
欣旺达_嵌入式软件工程师(准入职员工)
网易互娱内推,网易互娱内推码
网易**不管问你啥,记住一个话术原则小小的提醒下各位留子:**时不要直来直去有啥说啥;千万得多思考别说太满给自己留个思考或回旋的余地・1、被问 “有没有接触过网易的产品”(哪怕了解不多)别直接说 “没有”(容易显得缺乏兴趣)试试:“之前用过网易云音乐和网易新闻,对产品的界面设计和功能逻辑有过留意。虽然没有深入研究,但能感受到网易产品注重用户体验的特点,入职后会系统学习相关产品知识”・2、被问 “能接受高强度的项目加班吗”别勉强说 “没问题”(后续可能难以承受)试试:“我理解互联网行业项目推进时需要集中精力,在关键节点愿意配合团队加班。但也会注重提升工作效率,合理规划时间,尽量在正常工作时间完成...
点赞
评论
收藏
分享
2025-12-19 10:15
西安电子科技大学 通信技术工程师
你是想招我还是不想招我?
三番五次邀请我,诚意很大的感觉。结果一看已经投了俩月了。哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈顺便输出一下我的Offer List:[]挑战全网最少
双尔:
有种大学生特有的清澈的愚蠢
,这就是智联自动发送的广告邮件而已
点赞
评论
收藏
分享
2025-12-06 17:39
中国石油大学(华东) 前端工程师
求求让我找到实习吧
我的项目的代码都是ai写的,我是27届,想本科就直接就业,我学什么能找到工作啊,现在一个实习都找不到,求求大佬指点迷津😭😭😭
只会按tab的bug...:
多做一个前端项目吧 然后亮点每点写多一点 总共4-5点就行 技术栈和前端无关的删掉
点赞
评论
收藏
分享
01-22 13:25
清华大学 Java
AI Conding推荐
在 Java 开发领域,AI Coding 已经逐渐成为提升效率与代码质量的重要工具,选对工具比盲目跟风更关键。首推通用型大模型,如 ChatGPT、Claude。它们非常适合用于业务逻辑拆解、设计模式讲解、复杂 Bug 定位和代码重构建议,在阅读老代码、理解框架底层原理(如 Spring、JVM)时尤其高效。其次是代码补全与 IDE 深度集成工具,如 GitHub Copilot、Cursor、IntelliJ IDEA 自带的 AI Assistant。这类工具在写 Controller、DTO、Mapper、单元测试时体验极佳,能快速生成样板代码,显著减少重复劳动。对 Java 后端来说...
AI coding的好用...
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
牛客吐槽大会 | 有槽不吐,留着过年?吐完领现金红包,痛快!
4890
2
...
拥抱AI,程序员的最后出路
2371
3
...
J人永远闲不下来于是去提前实习
2076
4
...
真正会被取代的,是你心里面的幻觉
2006
5
...
马斯克最新炸裂采访,AI会带走一半工作岗位,普通人将何去何从?
1519
6
...
努力挣钱的意义具象化了
1443
7
...
mentor视角下的优秀实习生
1425
8
...
去独角兽做龙头还是去大厂做凤尾
1319
9
...
为什么说AI时代,老人反而没有新人吃香?
1315
10
...
大厂提前实习对AI开发的新感悟
1293
创作者周榜
更多
正在热议
更多
#
没关系,至少我的__很曼妙
#
2991次浏览
57人参与
#
机械人你知道哪些单休企业
#
82724次浏览
408人参与
#
赚钱的意义在这一刻具象化
#
3274次浏览
82人参与
#
AI时代的工作 VS 传统时代的工作,有哪些不同?
#
6803次浏览
154人参与
#
今年春招是金一银二嘛?
#
5328次浏览
58人参与
#
1月小结:你过的开心吗?
#
1210次浏览
41人参与
#
你的第一家实习公司是什么档次?
#
3159次浏览
54人参与
#
为什么有人零实习也能进大厂?
#
3492次浏览
74人参与
#
抛开难度不谈,你最想去哪家公司?
#
2706次浏览
70人参与
#
你的landing期是如何度过的?
#
6942次浏览
120人参与
#
一人一道大厂面试题
#
113989次浏览
1263人参与
#
当你问AI“你会取代我的工作吗”,它说_?
#
2634次浏览
83人参与
#
除了Java,最推荐学什么技术?
#
4605次浏览
119人参与
#
AI求职实录
#
2302次浏览
63人参与
#
你觉得什么岗位会被AI替代
#
36369次浏览
250人参与
#
在找工作求抱抱
#
1653399次浏览
10964人参与
#
参加完秋招的机械人,还参加春招吗?
#
103137次浏览
676人参与
#
哪些瞬间让你真切感受到了工作的乐趣
#
23160次浏览
99人参与
#
机械人春招想让哪家公司来捞你?
#
378897次浏览
3134人参与
#
银行笔面经互助
#
176420次浏览
1295人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务