前面的文章只是介绍了一些搜索引擎相关的概念,本文就介绍一下搜索引擎的完整工作流程。搜索页面的输入框是用户和搜索引擎进行交互的接口,其实这个搜索框仅仅是搜索引擎的冰山一角,可以思考一下几个问题:
- 搜索引擎返回的数据怎么来的?
- 搜索引擎如何准确地返回用户想要检索的信息?
- 搜索引擎如何能在极短的时间内返回信息?
- 搜索引擎返回的信息是如何排序的?
如果弄清楚了上面的几个问题,就对搜索引擎的工作原理有了简单的认识,本文将从以上几个问题出发介绍搜索引擎。
1 搜索引擎整体工作流程
搜索引擎本身包含网页抓取、网页评价、反作弊、建库、倒排索引、索引压缩、在线检索、ranking排序策略等等流程,下图是用户访问谷歌浏览器后其后台的工作流程:
下图是更加详细的搜索引擎工作流程:
本文只是简单地梳理一下搜索引擎的各个流程,每个模块的详细流程后面我会结合开源的一些文档具体总结。
这里先简单地以网页爬虫为引,简单说明一下:搜索引擎的各个模块都有非常多的问题需要解决。
2 搜索引擎基础:网页抓取
这是搜索引擎的第一步,毕竟搜索是建立在数据的基础之上的~,在之前我也写过一篇博客介绍使用Scrapy框架爬取网站数据,有兴趣的可以移步了解一下。网页抓取需要用到Spider,之所以称之为Spider是因为在抓取网页的过程中,Spider需要从当前爬取的网页中提取到子链(该网站中指向的其他网页的链接)。
名词解释:
作弊网站是指在网页设计中,为了提升网页在搜索引擎中的排序,设计者采用的一系列欺骗搜索引擎的做法,主要表现是普通用户看到的页面与搜索引擎抓取到的内容不一致。
robots.txt是网站放在服务器根目录下的一份文档,可以将其理解为网站和爬虫之间的一份协议,该文件会指出本网站允许哪些爬虫爬取哪些目录下的网页。
对于爬虫而言至少有如下问题需要解决:
- 由于互联网太大了,爬虫是很难抓取到所有的网页的
- 网页中存在垃圾网页和作弊网页,如何准确识别这些网页,避免其污染数据影响搜索结果
- 应该如何指定爬取的优先级呢?
- 应该侧重于深度爬取(从当前页面一直往下爬)还是广度爬取(先爬取先发现的网页)呢?
- 如何去重(相同url,内容高度相似)呢?
- 如何增量更新呢?
- 网页的内容可能会发生改变,如何确保数据库中已经爬取的网页是最新的呢?
- 整个爬虫框架应该如何设计呢?
- 如何让整个爬虫框架更高效?
- 如何合理的估计爬虫负载?
- 如何网站禁止爬虫爬取怎么办?
我会认真学习部分爬虫框架,并在之后的文章中仔细地分析。
书籍推荐
《这就是搜索引擎-核心技术详解》