译者序
《自制搜索引擎》一书终于和读者们见面了,“自制”系列图书的家族中又多了一名新成员。近几年,图灵先后出版了几本“自制”系列图书,如《30天自制操作系统》《自制编程语言》《两周自制脚本语言》等。在这些书中,我们不用去读枯燥乏味的原理和晦涩难懂的算法,只需跟随作者的脚步,即可从零开始,一步步地创造出操作系统或编程语言的雏形。
《自制搜索引擎》一书也不例外。在这本不到200页的书中,作者先用简明扼要、通俗易懂的语言为我们讲解了搜索引擎的结构及核心概念,紧接着又带领我们剖析了一个名为wiser的原创搜索引擎的源代码。理论与大量源代码的结合帮助我们迈入了搜索引擎的大门,只要用心阅读并实际操作,就能制作出一个可以在计算机上运行的简易搜索引擎。然而与其他计算机技术一样,虽然搜索引擎的入门很简单,但要成为这个领域的技术专家却并不容易,离不开大量的知识积累和实践。所以在分析完源代码以后,作者又带领我们优化了现有的wiser搜索引擎,并简单地介绍了一些更加专业的知识,以启发我们深入思考,为进一步学习铺平了道路。
阅读本书几乎不需要任何有关搜索引擎的知识储备,但由于wiser是用C语言编写的,所以您最好还是能有些C语言的编程经验。“啊,用C写的啊?”也许您也和我当初一样,一听是C语言就泄气了。的确,C语言不是那么好用。指针是个难点不说,有些语句的写法也显得很诡异,而且还缺乏丰富的内置函数和数据结构。但如果您坚信某某语言才是世界上最好的语言,并要因此放弃本书的话,那么我建议您先下载wiser的源代码读一读再做决定。wiser的源代码仅有大约2600行。即使只瞥一眼,也应该能够发现这些源代码不但具有详细的注释、清晰的结构,而且遵循了良好的命名规范。仔细地阅读后,甚至还能看到有些地方应用了回调函数、设计模式等所谓的“现代”编程技巧。不仅如此,作者还通过引入了名为uthash的代码库简化了对字符串、列表和哈希表的操作。例如要向列表中添加元素时,只需使用形如“LL_APPEND(*list, element); ”的一行代码,这就大大增加了代码的可读性。相信您读到最后也会由衷地感叹:原来C语言也能这么好用啊。
对于想要开发搜索引擎的读者来说,本书的作用自不必说。而对于专注于其他领域的开发者,甚至对于那些只是想学门新技术来娱乐一下的程序员来说,读读本书也是大有裨益的。例如,我们可以从中学到如何高效地求得多个大集合的交集,如何压缩存储大量的整数,如何运用sar命令查看并分析系统的性能等。即使我们不从事搜索引擎的开发工作,这些算法和技术也会对日常的工作有所启发和帮助。所以,读过了本书,就算您并不打算做一个搜索引擎出来,也能得到一些收获。
值得一提的是,在本书中很多叙述得较为简练甚至一笔带过的段落中,其实隐藏着大量的知识。在掌握了搜索引擎的核心技术后,不妨查查资料、写写代码,试着去掌握这些更高级的知识,搞清楚里面专业术语的含义。例如,书中提到了字典树(Tier)、Suffix Array等国内教材中罕见的数据结构,那么我们能不能用自己熟悉的编程语言实现它们?作者开发的开源搜索引擎Groonga采用了内存映射文件技术,那么内存映射文件的机制是什么……在不断探索这些问题的过程中,我们不但能把这本不算厚的书读得越来越厚,也能使自己的知识量不断增长。
最后,在这里衷心感谢在翻译过程中给予我支持与鼓励的各位。欢迎诸位读者批评指正,提出宝贵的建议。希望所有对搜索引擎感兴趣的读者都能从本书中获益。
胡屹
2015年10月于北京