记者:搜索引擎在当今Web技术中为何独占鳌头?
吴众欣:Web中什么信息最多?Web的非结构化的信息最多。这些信息需要整合,而search engine(SE)正是应运而生。Web新兴的事物:结构化Blog,FeedMesh,XMTP(eXtensible Markup Transport Protocol),XML序列化/反序列化,浏览器应用范围扩大,massive data。不用多谈,如果没有SE的出现,大家还不知道如何找这些信息源,SE现在是Web的基础设施,但请注意,它不是那种根本型的改变。浏览器与标记语言出现才是根本型的改变。SE是促进型的技术,它对新兴的事务很敏感,所以它必须独占鳌头,如果把网络存储的信息比做图书馆,管理员的角色很重要,我在交大找不到书,就得找管理员,这里得感谢他们一下。
记者:我们应该怎样看待开源的搜索引擎项目?
吴众欣:开源的项目就像是百宝箱,可以用,可以学,用来开发就不提了,能学什么?框架,编程技巧,算法。对于开源的搜索引擎项目,我要着重说一说“算法”。《代码之美》的序言中提到:算法+数据结构=程序,概念虽然有些老,但是年年企业招聘还是愿意考一些算法,《计算机程序设计艺术》的 高德纳 先生可以说用毕生的精力来导引大家,让大家觉得耍小聪明的人(自认为算法,临时拍拍脑袋想想就得), 支持侯 先 生的人(不懂算法,也能编程),总是达不到编程的标准,这让人想想都要暗笑,“玄之又玄,众妙之门”。事物展示到我们的面前分为物情与物理,物情通过使用 即可了解,想要由表及里,物理则需要挖掘“内幕”,“深入浅出”,达到“自己编写”的目的。这方面对于开源搜索引擎项目而言,更为突出。
记者:现在有哪些网站使用Lucene技术?
吴众欣:在Lucene网站的PoweredBy链接中给出了使用Lucene的站点,按照字母排序,其中Eclipse用它来做文档的检索,PSNC用它来做数字图书馆的架构,USAjobs Inc. Job Search是找工作的搜索引擎,其他的桌面搜索开发站点,琳琳总总不下几十个。如果我们再扩大一下,从使用Lucene的Nutch演化出的Hadoop项目,使用这个类GFS架构的还有巨人型站点Yahoo!等。所以我推荐大家也看看Lucene的衍生物,挺有意思,基本最近时髦的技术,比如MapReduce,BigTable等,都能在那里找到。
记者:能否介绍一下Lucene的技术特点?
吴众欣:Lucene的技术特点这里不多谈,只谈其中一点,就是Lucene的查询过程。在Lucene网站上的Benchmark大多谈的是标引过程,索引结构各个书籍也都有谈到,虽然,标引与查询是逆过程,但是查询也有自己的特色。最明显的就是在硬盘,内存,CPU三者均衡(balancing)的考虑。我们都知道压缩体在解压时耗费的是CPU,但是压缩可以节省硬盘的存储空间,I/O访问的时间减少了,这是均衡CPU处理与硬盘访问的时间。Lucene因为支持范围查询就为字典程序作了快表,没有用Hash,快表在查询时需要提前加载到内存中,就好象是汽车的引擎,冬天要预热一样。加入到内存中的快表与你字典文件的大小有关,与产生快表的单词跨度也有关,Lucene在 字典文件中每隔一个跨度就在快表里记录一个单词。跨度太小,内存占用太多,跨度太大,遍历硬盘上跨度内的单词也需要花费时间,这就是硬盘访问与内存访问的 均衡。当遇到多个查询词的情况时,还要考虑每个单词的部分评分保留在内存的情况,不到最后一个查询词出现,就得不到最后评分,要是能限定一下内存,先在内 存中保存前1024个文档的部分评分,CPU先计算1-1024文档的总分,然后再计算N/1024次,其中N是文集中文档的个数,这样遇到前面的查询词是高频词,也不会因为保存其部分评分而使内存耗费过大,这就是CPU与内存的均衡。硬盘,内存,CPU,这三者C3取2,呵呵,我都介绍了。
Lucene使用了多种现代搜索领域的算法,稍微深入探讨现代的搜索领域即可发现它不是突出大家对语言的熟悉程度,而是大家解决问题的方法即算法。以前有多人想对Lucene进行语言层面的改造,改造为C plus plus,我想性能虽小有差异,但无此必要。
记者:常常有一些读者提出这样的问题:我想做一个搜索引擎,应该怎么做?
吴众欣:这个问题,我在百度“知道”上回答过,这种问题提出的人不少,可见大家都想很快上手。这里套用一下我百度的回答吧:
http://www.ir.iit.edu/~dagr/cs529/files/ir_book/CHAP%204%20Inverted%20Index.PDF,
给出了基于倒排索引的检索原型实现的简单代码,你可以了解一下。入手不难。如果想了解开源的搜索引擎实现,有Lucene与MG4J,斯芬克斯等等,关于lucene你可以看《lucene分析与应用》,这是我和家立写的,底层你就差不多了。但请注意,这不是一个完整的搜索引擎,你还需要看Nutch的网页抓取过程,建议看《Java机器人编程》这本书,再回头看Nutch,就会很快的入门了。
记者:目前您主要是从事什么工作,研究的领域?(如有相关的开发的经验就更好了)
吴众欣:目前的研究领域是服务组合,这是一个更加有意思的问题,举个例子,就像是工厂的流水线,将各种部件集成起来,形成一个完整的产品,中间有更多的变数发生。但不属于这次访谈的内容,我们就不多谈了。
与SE的相关开发经验,有一点。比如自己写过了一个中文分词解析器,用C#写的,算法基于Dijkstra,但是这个是一种经验型的解析器,不太完善。还有就是从倒排索引,恢复出被索引的文档,这需要对索引的过程,结构比较了解。还有就是用国图的都柏林core文档,做了多于 100M
条记录的索引,其中分词器有CJK分析器,标准分词器,自然语言分词器,产生了3个类别的索引,对Lucene的中文查询性能好好的测试了一遍,呵呵,谁给我一个大众普适的中文查询词分布,就能告诉大家那种分词效果好了,Zipf定律也不一定对!
记者:您最近出了一本关于Lucene技术的书,这是怎样的一本书?请谈一谈,《Lucene分析与应用》包括哪些内容?
吴众欣:《Lucene分析与应用》是对Lucene源代码进行深入分析的书籍,迄今为止,它是分析最透彻的一本。从标引到查询,主要的过程,算法,都讲到了。前面提到的Lucene特点,在这本书中讲的很细致。勘误内容也发在china-pub上,是想给大家提供一本有质量保证的书,同时也希望大家不要只想着去用,想想怎么掌握根本的东西,我们自己是否也能创新?赵炯那本《linux源码分析》早写出来了,操作系统方面中国怎么一直就没突破?好像是一个国际操作系统牛会,中国15年都没发文了,大家灌水的功夫都不够了?
记者:对未来搜索技术的演化,衍生,变革有哪些预见?
吴众欣:谈不上预见,搜索技术带来了大家对信息的关联关系认识从关系代数的强关联,到松关联的关系上来,恨不得都是key与value对, 大而简单的表。弹性的框架是大家近期追求的,云计算也是网格的社会主义初级阶段的典范,针对的问题都是有一定规模的数据量,效能越来越被重视,解决方案也 越来越实际,想清楚的了解发展趋势,就得深入的探源这些技术背后的本质,从细微处着手,大处着眼,看技术云升云涌,潮起潮落!这套用了程序员的一句话了!
《科学的历程》,《相对论》,《建筑模式语言》,《李约瑟看中国古代科技史》,《明式家具研究》,《鉴余杂稿》大家也都看看,不但打破我们东方思维模式,被西方文化冲击时,还能保留我们自己一些有益的文化内涵!