数据结构与算法之美
王争
前 Google 工程师
283752 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 81 讲
基础篇 (38讲)
数据结构与算法之美
15
15
1.0x
00:00/00:00
登录|注册

53 | 算法实战(二):剖析搜索引擎背后的经典数据结构和算法

摘要信息和网页快照支持
网页权重计算
归并排序
广度优先遍历
AC自动机
单模式字符串匹配算法
布隆过滤器
Trie树
散列表
结果展示
网页编号统计
倒排索引查询
偏移位置查询
单词编号查询
分词处理
单词偏移位置文件:term_offset.bin
倒排索引文件:index.bin
多路归并排序
单词编号文件:term_id.bin
临时索引文件:tmp_Index.bin
中文分词
英文分词
JavaScript代码、CSS样式去除
HTML标签抽取
去重爬取
页面链接解析
网页链接及编号对应文件:doc_id.bin
原始网页存储文件:doc_raw.bin
布隆过滤器文件:bloom_filter.bin
队列文件:links.bin
广度优先搜索
支持摘要信息和网页快照的改造
广度优先策略选择
优化和细节
数据结构和算法
用户搜索功能
倒排索引构建
分词与临时索引
网页文本抽取
技术细节
网页爬取
课后思考
总结引申
查询
索引
分析
搜集
搜索引擎设计思路

该思维导图由 AI 生成,仅供参考

像百度、Google 这样的搜索引擎,在我们平时的工作、生活中,几乎天天都会用到。如果我们把搜索引擎也当作一个互联网产品的话,那它跟社交、电商这些类型的产品相比,有一个非常大的区别,那就是,它是一个技术驱动的产品。所谓技术驱动是指,搜索引擎实现起来,技术难度非常大,技术的好坏直接决定了这个产品的核心竞争力。
在搜索引擎的设计与实现中,会用到大量的算法。有很多针对特定问题的算法,也有很多我们专栏中讲到的基础算法。所以,百度、Google 这样的搜索引擎公司,在面试的时候,会格外重视考察候选人的算法能力。
今天我就借助搜索引擎,这样一个非常有技术含量的产品,来给你展示一下,数据结构和算法是如何应用在其中的。

整体系统介绍

像 Google 这样的大型商用搜索引擎,有成千上万的工程师,十年如一日地对它进行优化改进,所以,它所包含的技术细节非常多。我很难、也没有这个能力,通过一篇文章把所有细节都讲清楚,当然这也不是我们专栏所专注的内容。
所以,接下来的讲解,我主要给你展示,如何在一台机器上(假设这台机器的内存是 8GB, 硬盘是 100 多 GB),通过少量的代码,实现一个小型搜索引擎。不过,麻雀虽小,五脏俱全。跟大型搜索引擎相比,实现这样一个小型搜索引擎所用到的理论基础是相通的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

搜索引擎的设计与实现涉及到大量的算法和数据结构,体现了其技术含量和复杂性。本文以搜索引擎为例,介绍了数据结构和算法在搜索引擎中的应用,包括搜集、分析、索引和查询四个部分。在搜集阶段,搜索引擎利用广度优先搜索策略爬取网页,将互联网视为有向图,介绍了搜集阶段涉及的关键技术细节。在分析阶段,搜索引擎需要对网页进行离线分析,包括抽取网页文本信息和分词并创建临时索引。文章还介绍了分词并创建临时索引、索引和查询阶段的具体实现方法,涉及到的数据结构和算法有:字典、Trie树、归并排序、倒排索引等。通过对这些技术细节的介绍,读者可以快速了解搜索引擎的基本原理和相关技术特点,为进一步深入学习和实践提供了基础。搜索引擎选择广度优先策略来爬取网页,而不是深度优先策略,是因为广度优先能够更全面地覆盖网页,符合搜索引擎的需求。此外,搜索引擎在结果显示的时候,支持摘要信息和网页快照,只需要对设计思路稍加改造,就可以支持这两项功能。整体而言,本文介绍了搜索引擎的技术特点和基本原理,为读者提供了深入了解和学习的基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据结构与算法之美》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(52)

  • 最新
  • 精选
  • 天凉好个秋
    倒排索引中记录了每个单词以及包含它的网页列表,想问一下“倒排索引”这个名字是怎么来的?其中的“倒排”体现在哪里呢?

    作者回复: 正排-》文档包含哪些单词 倒排-》单词被哪些文档包含

    2019-01-28
    4
    114
  • 纯洁的憎恶
    搜集:将广度优先搜索的优先队列存储在磁盘文件links.bin(如何解析网页内的链接?),有布隆过滤器判重并定期写入磁盘文件bloom_filter.bin,将访问到的原始网页数据存入磁盘文件doc_raw.bin,计数分配网页编号并与其链接对应关系存入磁盘文件doc_id.bin。 分析:首先抽取网页文本信息,依据HTML语法规范,通过AC自动机多模式串匹配算法,去除网页中格式化部分,提取文本内容。然后分词并创建临时索引,分词的目的是找到能够标识网页文本“身份”的特征,可借助词库(通过Trie树实现)搜索文本中与词库匹配的最长词语,因为一般情况下越长信息越多,越剧有表征能力(为什么英文简单?)。分词完成后得到一组用于表征网页的单词列表,与其对应的网页编号存入磁盘文件tmp_index.bin作为临时索引,为节省空间单词是以单词编号的形式写入,单词文本与编号的对应关系写入磁盘文本term_id.bin。 索引:通过临时索引构建倒排索引文件index.bin。倒排索引其实是以单词为主键,将临时索引中的多个相同单词行合并为一行。通过以单词为主键的排序算法,可以将相同单词的行连续排列在一起,之后只要将单词相同的连续行合并为一行即可。由于数据量大,应采用分治策略。最后建立所有单词在倒排索引文件中位置的索引文件term_offset.bin,以方便快速查找。 查询:先对搜索条件文本做分词处理,然后去term_id.bin查单词们的编号,再查term_offset.bin找到单词们在倒排索引中的位置,到index.bin找到每个单词对应的网页编号,通过网页出现次数、预评权重和统计算法(如pagerank、tf-idf)计算网页的优先次序并输出。最后在doc_in.bin中找到网页链接按序输出显示给用户。 这样理解对不?

    作者回复: 赞

    2019-01-28
    2
    36
  • steve
    老师好 看了这篇之后我也想实现一个搜索引擎 现在很多公司里应该都用的cpp吧 我也想用cpp实现一个 请问下有没有可参考的代码 怕写到一半写不下去😂

    作者回复: 我写过一个5万行的搜索引擎,cpp实现的,还有对应的几十页的文档,等过一整子整理一下放到公号众里:小争哥

    2019-10-21
    5
    26
  • alic
    有没有代码实现的例子?

    作者回复: 木有。等我有空了可以写下分享出来。

    2019-01-28
    6
  • 往事随风,顺其自然
    可以讲讲到排序索引和普通索引区别?

    作者回复: 啥事排序索引和普通索引呢?我文中好像没讲到呢

    2019-01-29
    3
  • Zhangxuesong
    爬虫按照广度优先的策略,不停地从队列中取出链接,然后“取“ -> “去“ 爬取对应的网页,解析出网页里包含的其他网页链接,再将解析出来的链接添加到队列中。 上面这段话里面有个词不是很通, 不知道后面还能修正么。

    作者回复: 编辑,麻烦修改下错别字,多谢。

    2019-04-17
    1
  • 超威丶
    请问倒排索引这种结构比b树快是不是依赖于它的数据结构优势?

    作者回复: 是的,两个东西的应用场景不大一样的。

    2019-03-07
    1
  • 蚂蚁内推+v
    王老师,字典使用最长匹配?那例子中的”中国“”中国人“不就无法匹配到了吗

    作者回复: 在这个例子中是的。“中国人好样的”这个句子分词就可以匹配到“中国人”

    2019-01-28
    1
  • Lukia
    老师好,本文中好像没有看到ac自动机的应用

    作者回复: 哦哦哦 你的意思是搜索引擎会用到ac自动机是吧

    2019-09-01
    2
  • Kudo
    原理是看懂了,实现起来肯定会遇到各种各样的问题,手动实现一遍是有必要的,如果老师能提供一个参考代码就更好了。

    作者回复: 这个写起来比较多,我有个5万+行的C++代码,估计看起来也比较费劲!你还是自己写吧:)

    2019-01-29
收起评论
显示
设置
留言
52
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部