技术分为道和术两种,具体的做事方法是术,做事的原理和原则是道。
以搜索引擎为例,很多具体的搜索技术很快会从独门绝技到普及,再到落伍,追求术的人一辈子工作很辛苦。只有掌握了搜索本质和精髓才能永远游刃有余。很多人想通过“术”,来走捷径,但是真正做好一件事没有捷径,离不开一万小时的专业训练。最好搜索,最基本的要求就是每天分析10-20个不好的搜索结果,累积一段时间才会有感觉,在Google的第一技术负责人阿米特.辛格至今依然经常分析那些不好的搜索结果。但是,很多做搜索的工程师(美国的,中国的都有)都做不到这一点,他们总是指望靠一个算法、一个模型就能毕其功于一役,而这并不现实的。
关于搜素引擎的原理其实非常简单,建立一个搜索引擎大致需要做这几件事:自动下载尽可能多的网页; 建立快速有效的索引;根据相关性对网页进行公平准确的排序。所以把搜搜所有的搜索产品都提炼成下载、索引和排序这三种基本服务。这就是搜索的“道”。所有的搜索服务都可以在这三个基本服务的基础上很快实现,这就是”术“。
布尔代数
世界上没有比二进制更简单的技术方法,它只有2个数字:0和1。从单纯数学的角度来讲,它甚至比我们的十进制更合理。经过历史伟大数学家对二进制的进一步完善,并用0和1表示两个数字,成为我们今天使用的二进制。二进制除了是一种计数的方式外,他还可以表示逻辑的“是”与“非”。这第二个特性在索引中非常重要。布尔运算是针对二进制,尤其是二进制第二个特征的运算,它很简单,可能没有比布尔运算更简单的运算了。尽管今天每个搜索引擎都宣称自己如何聪明,多么智能(这个词非常忽悠人),其实从根本上都没有逃出布尔运算的框框。
索引
大部分使用搜索引擎的人都会吃惊为什么它能在零点零几秒钟内找到成千上万甚至上亿的搜索结果。显然,如果是扫描所有的文本,计算机扫描的速度再快也不可能做到这一点的,那是为什么呢?这个技巧就是建索引。这就如图我们科技读物末尾的索引,或者图书馆的索引。如何简单地介绍搜索引擎?一个好的解答是:拿图书馆的索引卡片做类比。每个网站就像图书馆里的一本书,我们不可能在图书馆书架上一本本地找,而是要通过搜索卡片找到它的位置,然后直接去书架上拿。图书馆的索引卡片当然无法进行复杂的逻辑运算。但是,当信息检索进入计算机时代后,图书的索引便不再是卡片,而是基于数据库的。数据库的查询语句(SQL)支持各种复杂的逻辑组合,但是背后的基本原理是基于布尔运算的,至今如此。早期的文献检索查询系统,严格要求查询语句符合布尔运算。相比之下,今天的搜索引擎要聪明得多,它会自动把用户的查询语句转换成布尔运算的算式,但是基本的原理并没有什么不同。(最简单的索引结构是用一个很长的二进制数表示一个关键字是否出现在每篇文献中,有多少篇文献,就有多少位数,每一位对应一篇文献,1代表相应的文献有这个关键字,0代表没有。)
注意,计算机做布尔运算是非常非常快的。现在最便宜的微机都可以在一个指令周期内进行32位布尔运算,一秒钟进行数十亿次以上。当然,由于这些二进制数中的绝大部分位数都是0,只需要记录那些等于1的位数就可以。于是,搜索引擎的索引就变成一张大表:表的每一行对应一个关键词,而每一个关键词后面跟一组数字,是包含该关键词的文献序列。
对于互联网的搜索引擎来讲,每一个网页就是一个文献。互联网的网页数量是巨大的,网络中的所用的词也非常非常多。因此,这个索引是巨大的,在万亿字节这个量级。由于之前受计算机速度与容量的限制,早期的搜索引擎只能对重要、关键的主题词建立索引。现在为了保证对任何搜索都能提供相关的网页,常见的搜索引擎都会对所有的词进行索引。但是,在工程上却既具有挑战性。
随着互联网上的内容的增加,尤其是在互联网2.0时代,用户产生的内容越来越多,即时是Google这样的服务器数量近乎无限的公司,也感觉到数据增加带来的压力。因此,需要根据网页的重要性,质量和访问的频率建立常用和非常用等不同级别的索引。常用的索引需要访问速度快,附加信息多,更新也要快;而非常用的要求就低很多了。但不论搜索引擎的索引在工程上如何复杂,原理上依然非常简单,即等价于布尔运算。