后端技术杂谈2:搜索引擎工做原理

本文做者:顿炖
连接:https://www.zhihu.com/question/19937854/answer/98791215
来源:知乎java

本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到个人仓库里查看git

https://github.com/h2pl/Java-Tutorialgithub

喜欢的话麻烦点下Star哈面试

本系列文章将整理于个人我的博客:算法

www.how2playlife.com数据库

该系列博文会介绍常见的后端技术,这对后端工程师来讲是一种综合能力,咱们会逐步了解搜索技术,云计算相关技术、大数据研发等常见的技术喜提,以便让你更完整地了解后端技术栈的全貌,为后续参与分布式应用的开发和学习作好准备。编程

若是对本系列文章有什么建议,或者是有什么疑问的话,也能够关注公众号【Java技术江湖】联系我,欢迎你参与本系列博文的创做和修订。后端

写在前面

Max Grigorev最近写了一篇文章,题目是《What every software engineer should know about search》,这篇文章里指出了如今一些软件工程师的问题,他们认为开发一个搜索引擎功能就是搭建一个ElasticSearch集群,而没有深究背后的技术,以及技术发展趋势。Max认为,除了搜索引擎自身的搜索问题解决、人类使用方式等以外,也须要解决索引、分词、权限控制、国际化等等的技术点,看了他的文章,勾起了我多年前的想法。浏览器

不少年前,我曾经想过本身实现一个搜索引擎,做为本身的研究生论文课题,后来琢磨半天没有想出新的技术突破点(相较于已发表的文章),因此切换到了大数据相关的技术点。当时没有写出来,心中有点小遗憾,毕竟凭借搜索引擎崛起的谷歌是我心里渴望的公司。今天我就想结合本身的一些积累,聊聊做为一名软件工程师,您须要了解的搜索引擎知识。缓存

搜索引擎发展过程

现代意义上的搜索引擎的祖先,是1990年由蒙特利尔大学学生Alan Emtage发明的Archie。即使没有英特网,网络中文件传输仍是至关频繁的,并且因为大量的文件散布在各个分散的FTP主机中,查询起来很是不便,所以Alan Emtage想到了开发一个能够以文件名查找文件的系统,因而便有了Archie。Archie工做原理与如今的搜索引擎已经很接近,它依靠脚本程序自动搜索网上的文件,而后对有关信息进行索引,供使用者以必定的表达式查询。

互联网兴起后,须要可以监控的工具。世界上第一个用于监测互联网发展规模的“机器人”程序是Matthew Gray开发的World wide Web Wanderer,刚开始它只用来统计互联网上的服务器数量,后来则发展为可以检索网站域名。

随着互联网的迅速发展,天天都会新增大量的网站、网页,检索全部新出现的网页变得愈来愈困难,所以,在Matthew Gray的Wanderer基础上,一些编程者将传统的“蜘蛛”程序工做原理做了些改进。现代搜索引擎都是以此为基础发展的。

搜索引擎分类

  • 全文搜索引擎

当前主流的是全文搜索引擎,较为典型的表明是Google、百度。全文搜索引擎是指经过从互联网上提取的各个网站的信息(以网页文字为主),保存在本身创建的数据库中。用户发起检索请求后,系统检索与用户查询条件匹配的相关记录,而后按必定的排列顺序将结果返回给用户。从搜索结果来源的角度,全文搜索引擎又可细分为两种,一种是拥有本身的检索程序(Indexer),俗称“蜘蛛”(Spider)程序或“机器人”(Robot)程序,并自建网页数据库,搜索结果直接从自身的数据存储层中调用;另外一种则是租用其余引擎的数据库,并按自定的格式排列搜索结果,如Lycos引擎。

  • 目录索引类搜索引擎

虽然有搜索功能,但严格意义上不能称为真正的搜索引擎,只是按目录分类的网站连接列表而已。用户彻底能够按照分类目录找到所须要的信息,不依靠关键词(Keywords)进行查询。目录索引中最具表明性的莫过于大名鼎鼎的Yahoo、新浪分类目录搜索。

  • 元搜索引擎

    元搜索引擎在接受用户查询请求时,同时在其余多个引擎上进行搜索,并将结果返回给用户。著名的元搜索引擎有InfoSpace、Dogpile、Vivisimo等,中文元搜索引擎中具表明性的有搜星搜索引擎。在搜索结果排列方面,有的直接按来源引擎排列搜索结果,如Dogpile,有的则按自定的规则将结果从新排列组合,如Vivisimo。

相关实现技术

搜索引擎产品虽然通常都只有一个输入框,可是对于所提供的服务,背后有不少不一样业务引擎支撑,每一个业务引擎又有不少不一样的策略,每一个策略又有不少模块协同处理,及其复杂。

搜索引擎自己包含网页抓取、网页评价、反做弊、建库、倒排索引、索引压缩、在线检索、ranking排序策略等等知识。

  • 网络爬虫技术

网络爬虫技术指的是针对网络数据的抓取。由于在网络中抓取数据是具备关联性的抓取,它就像是一只蜘蛛同样在互联网中爬来爬去,因此咱们很形象地将其称为是网络爬虫技术。网络爬虫也被称为是网络机器人或者是网络追逐者。

网络爬虫获取网页信息的方式和咱们平时使用浏览器访问网页的工做原理是彻底同样的,都是根据HTTP协议来获取,其流程主要包括以下步骤:

1)链接DNS域名服务器,将待抓取的URL进行域名解析(URL------>IP);

2)根据HTTP协议,发送HTTP请求来获取网页内容。

一个完整的网络爬虫基础框架以下图所示:

整个架构共有以下几个过程:

1)需求方提供须要抓取的种子URL列表,根据提供的URL列表和相应的优先级,创建待抓取URL队列(先来先抓);

2)根据待抓取URL队列的排序进行网页抓取;

3)将获取的网页内容和信息下载到本地的网页库,并创建已抓取URL列表(用于去重和判断抓取的进程);

4)将已抓取的网页放入到待抓取的URL队列中,进行循环抓取操做;

  • 索引

从用户的角度来看,搜索的过程是经过关键字在某种资源中寻找特定的内容的过程。而从计算机的角度来看,实现这个过程能够有两种办法。一是对全部资源逐个与关键字匹配,返回全部知足匹配的内容;二是如同字典同样事先创建一个对应表,把关键字与资源的内容对应起来,搜索时直接查找这个表便可。显而易见,第二个办法效率要高得多。创建这个对应表事实上就是创建逆向索引(inverted index)的过程。

  • Lucene

Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构。

全文检索大致分两个过程,索引建立 (Indexing) 和搜索索引 (Search) 。

索引建立:将现实世界中全部的结构化和非结构化数据提取信息,建立索引的过程。
搜索索引:就是获得用户的查询请求,搜索建立的索引,而后返回结果的过程。

非结构化数据中所存储的信息是每一个文件包含哪些字符串,也即已知文件,欲求字符串相对容易,也便是从文件到字符串的映射。而咱们想搜索的信息是哪些文件包含此字符串,也即已知字符串,欲求文件,也即从字符串到文件的映射。二者偏偏相反。因而若是索引总可以保存从字符串到文件的映射,则会大大提升搜索速度。

因为从字符串到文件的映射是文件到字符串映射的反向过程,因而保存这种信息的索引称为反向索引 。

反向索引的所保存的信息通常以下:

假设个人文档集合里面有100篇文档,为了方便表示,咱们为文档编号从1到100,获得下面的结构

每一个字符串都指向包含此字符串的文档(Document)链表,此文档链表称为倒排表 (Posting List)。

  • ElasticSearch

Elasticsearch是一个实时的分布式搜索和分析引擎,能够用于全文搜索,结构化搜索以及分析,固然你也能够将这三者进行组合。Elasticsearch是一个创建在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎,可是Lucene只是一个框架,要充分利用它的功能,须要使用JAVA,而且在程序中集成Lucene。Elasticsearch使用Lucene做为内部引擎,可是在使用它作全文搜索时,只须要使用统一开发好的API便可,而不须要了解其背后复杂的Lucene的运行原理。

  • Solr

Solr是一个基于Lucene的搜索引擎服务器。Solr 提供了层面搜索、命中醒目显示而且支持多种输出格式(包括 XML/XSLT 和 JSON 格式)。它易于安装和配置,并且附带了一个基于 HTTP 的管理界面。Solr已经在众多大型的网站中使用,较为成熟和稳定。Solr 包装并扩展了 Lucene,因此Solr的基本上沿用了Lucene的相关术语。更重要的是,Solr 建立的索引与 Lucene 搜索引擎库彻底兼容。经过对Solr 进行适当的配置,某些状况下可能须要进行编码,Solr 能够阅读和使用构建到其余 Lucene 应用程序中的索引。此外,不少 Lucene 工具(如Nutch、 Luke)也可使用Solr 建立的索引。

  • Hadoop

谷歌公司发布的一系列技术白皮书致使了Hadoop的诞生。Hadoop是一系列大数据处理工具,能够被用在大规模集群里。Hadoop目前已经发展为一个生态体系,包括了不少组件,如图所示。

Cloudera是一家将Hadoop技术用于搜索引擎的公司,用户能够采用全文搜索方式检索存储在HDFS(Hadoop分布式文件系统)和Apache HBase里面的数据,再加上开源的搜索引擎Apache Solr,Cloudera提供了搜索功能,并结合Apache ZooKeeper进行分布式处理的管理、索引切分以及高性能检索。

  • PageRank

谷歌Pagerank算法基于随机冲浪模型,基本思想是基于网站之间的相互投票,即咱们常说的网站之间互相指向。若是判断一个网站是高质量站点时,那么该网站应该是被不少高质量的网站引用又或者是该网站引用了大量的高质量权威的站点。

  • 国际化

坦白说,Google虽然作得很是好,不管是技术仍是产品设计,都很好。可是国际化确实是很是难作的,不少时候在细分领域仍是会有其余搜索引擎的生存余地。例如在韩国,Naver是用户的首选,它自己基于Yahoo的Overture系统,广告系统则是本身开发的。在捷克,咱们则更多会使用Seznam。在瑞典,用户更多选择Eniro,它最初是瑞典的黄页开发公司。

国际化、个性化搜索、匿名搜索,这些都是Google这样的产品所不能彻底覆盖到的,事实上,也没有任何一款产品能够适用于全部需求。

本身实现搜索引擎

若是咱们想要实现搜索引擎,最重要的是索引模块和搜索模块。索引模块在不一样的机器上各自进行对资源的索引,并把索引文件统一传输到同一个地方(能够是在远程服务器上,也能够是在本地)。搜索模块则利用这些从多个索引模块收集到的数据完成用户的搜索请求。所以,咱们能够理解两个模块之间相对是独立的,它们之间的关联不是经过代码,而是经过索引和元数据,以下图所示。

对于索引的创建,咱们须要注意性能问题。当须要进行索引的资源数目很少时,隔必定的时间进行一次彻底索引,不会占用很长时间。但在大型应用中,资源的容量是巨大的,若是每次都进行完整的索引,耗费的时间会很惊人。咱们能够经过跳过已经索引的资源内容,删除已不存在的资源内容的索引,并进行增量索引来解决这个问题。这可能会涉及文件校验和索引删除等。另外一方面,框架能够提供查询缓存功能,提升查询效率。框架能够在内存中创建一级缓存,并使用如 OSCache或 EHCache缓存框架,实现磁盘上的二级缓存。当索引的内容变化不频繁时,使用查询缓存更会明显地提升查询速度、下降资源消耗。

搜索引擎解决方案

  • Sphinx

俄罗斯一家公司开源的全文搜索引擎软件Sphinx,单一索引最大可包含1亿条记录,在1千万条记录状况下的查询速度为0.x秒(毫秒级)。Sphinx建立索引的速度很快,根据网上的资料,Sphinx建立100万条记录的索引只需3~4分钟,建立1000万条记录的索引能够在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。

  • OmniFind

OmniFind 是 IBM 公司推出的企业级搜索解决方案。基于 UIMA (Unstructured Information Management Architecture) 技术,它提供了强大的索引和获取信息功能,支持巨大数量、多种类型的文档资源(不管是结构化仍是非结构化),并为 Lotus®Domino®和 WebSphere®Portal 专门进行了优化。
下一代搜索引擎

从技术和产品层面来看,接下来的几年,甚至于更长时间,应该没有哪一家搜索引擎能够撼动谷歌的技术领先优点和产品地位。可是咱们也能够发现一些现象,例如搜索假期租房的时候,人们更喜欢使用Airbub,而不是Google,这就是针对匿名/个性化搜索需求,这些需求是谷歌所不能彻底覆盖到的,毕竟原始数据并不在谷歌。咱们能够看一个例子:DuckDuckGo。这是一款有别于大众理解的搜索引擎,DuckDuckGo强调的是最佳答案,而不是更多的结果,因此每一个人搜索相同关键词时,返回的结果是不同的。

另外一个方面技术趋势是引入人工智能技术。在搜索体验上,经过大量算法的引入,对用户搜索的内容和访问偏好进行分析,将标题摘要进行必定程度的优化,以更容易理解的方式呈现给用户。谷歌在搜索引擎AI化的步骤领先于其余厂商,2016年,随着Amit Singhal被退休,John Giannandrea上位的交接班过程后,正式开启了自身的革命。Giannandrea是深度神经网络、近似人脑中的神经元网络研究方面的顶级专家,经过分析海量级的数字数据,这些神经网络能够学习排列方式,例如对图片进行分类、识别智能手机的语音控制等等,对应也能够应用在搜索引擎。所以,Singhal向Giannandrea的过渡,也意味着传统人为干预的规则设置的搜索引擎向AI技术的过渡。引入深度学习技术以后的搜索引擎,经过不断的模型训练,它会深层次地理解内容,并为客户提供更贴近实际需求的服务,这才是它的有用,或者可怕之处。

Google搜索引擎的工做流程

贴个图,本身感觉下。

详细点的 :

相关文章
相关标签/搜索