搜索是个看起来很神奇的东西,亿亿万万的网页,一瞬间以合适的排名顺序给展现出来了。
搜索很复杂,也很简单。
复杂,因为要公平准确地推出满足用户需求的结果不容易。
简单,因为搜索的基本原理是很简单的,简单到,只要布尔运算就可以。
技术分为术和道,在这里只讨论了道,即讨论原理和原则;而对于具体的方法,不在这里讨论。
建立一个搜索引擎要做这样几件事:
1. 自动下载尽可能多的网页(让我想起了暗网,有兴趣的读友可以自行百度);
2. 建立快速有效的索引;
3. 根据相关性对网页进行公平准确的排序。
对于用户输入的关键词,搜索引擎要判断每篇文献是否含有这个关键词。有的话就展现出来。
那么,搜索引擎是怎么做到零点几秒找到上亿篇文章的?
索引!
形象地解释,以搜索“原子”为例子。搜索引擎会先给所有的文献序列打上个标签,即这篇文献是否包含关键词“原子”。表的形式可能是“原子:1000100001”,即代表第1、5、10篇文献包含了这个关键词,可以很快地筛选出来。
进一步地,用户如果想一起搜索“原子”和“分子”,而“分子”这张表是“1000000000”,那么只有第一篇文献会被检索出来。
于是,搜索引擎的索引就变成了一张大表:表的每一行对应一个关键词,而每一个关键词后面跟着一组数字,表示包含该关键词的文献序号。
敏锐的小伙伴可能已经想到了,网页那么多,词汇那么多,这么做的话,数据量大小是不是个天量数据啊?
是的。
假如互联网上有100亿个有意义的网页,而词汇表的大小是30万,那么这个索引的大小至少是3000万亿。考虑到大多数词只出现在一部分文本中,对索引进行压缩,也会有30万亿的量级。
为了网页排名,索引中还需要存储大量的附加信息,如每个词出现的位置、次数等。
怎么解决?
没有其他很高大上办法。只能通过分布式部署的方式去解决,也就是所谓的“云”。
根据网页的序号将索引分成很多份存储到不同的服务器上,每接受一个查询时,这些服务器同时并行处理用户请求,并把结果送到主服务器进行合并处理,再把结果返回用户。
还有最后一步,即使是这样,google也感受到了数据增长带来的压力。因此,还需要根据网页的重要性、质量和访问的频率建立常用的和非常用的等不同级别的索引。
常用索引访问速度快,附件信息多,更新快;非常用的则在要求上有所降低。
原理上是很简单,但搜索引擎的索引在工程上可不是一个简单的东西。
推荐《自己动手写搜索引擎》一书,可窥一斑。
以上。