存档未分类

【原创】网易搜索引擎架构讲座笔记

12月27号,网易搜索引擎“有道”的架构师周枫来我们学校做了一次关于网易搜索引擎架构的讲座,我去听了,记录下来一些我认为有用的信息。

搜索服务质量的四个维度:时效性,完备性,相关性和呈现形式。

采用分布式的架构,查询分发与结果聚合。

基础设施

分布式文件系统自动复制数据,在软件层次解决硬件可用性问题。分布式计算系统自动划分和重试任务。

抓取

抓取的首要问题是调度。抓取礼貌性和带宽利用率,最终的目的是提高整个网页库的质量。

链接分析:分布式的根据链接关系进行静态评分。重复或近似重复页面检测。使用Shingles方法,去除大约40%-50%的页面。

垃圾网页(SPAM)检测和处理,自动分类和手工封禁相结合。

前台

目标:在满足响应速率要求的前提下,尽量提高吞吐率。300ms是响应时间的临界值。将索引库分配到足够多的服务器上,缓存查询结果。索引所占空间大小对于性能影响很大。压缩索引->性能提高。可以将倒排索引压缩20%-30%。

搜索引擎查询的三类:导航类(20%-40%),信息类和交易类。

博客搜索

问题定义:通过关键词查询搜索博客文章,以及博客站点和blogger。主要基于抓取和RSS Feed(包括Atom等)。

强调对博客信息的分析。

如何查找指向某个博客的所有链接:

使用流-排序分布式计算模型(Stream Sort Model),使用多台互相通信的机器

1.按机器平均分配所有边

2.读入所有边,按v2划分发送到相应机器

3.每台机器将所有接收到的边按v2排序

4.排序结果中相邻有相同v2的边是指向v2的所有边

网络释义

把搜索和辞典结合起来。

假设:在网络中,很近距离同时出现的中外文词很有可能互为解释关系。如果同对中外文词在不同网页中出现很多次,则是正确解释关系的可能性就很大。

抽取,归一化(忽略大小写等),统计出现次数,输出超过一定次数的对

留言

创意的丢失–China-pub,当当与Amazon的雷同

很早的时候就在Amazon看到了这种风格的页面,后来发现这样的风格也被China-pub和当当给采用了。

下面是Amazon的:

Amazon

China-pub的:

China-pub

当当的:

dangdang

留言

一些常用Eclipse插件的在线更新地址

下面是一些常用的Eclipse插件的在线更新地址:

  • TestNGhttp://beust.com/eclipse
  • Maven2:http://m2eclipse.codehaus.org/
  • Aptana:http://update.aptana.com/update/
  • SubEclipse:http://subclipse.tigris.org/update_1.0.x
  • AJDT:http://download.eclipse.org/technology/ajdt/31/update
  • SpringIDE:http://springide.org/updatesite/
  • VelocityEclipsePlugins:http://veloedit.sourceforge.net/updates/
  • RadRails:http://radrails.sourceforge.net/update
  • RDT:http://updatesite.rubypeople.org/release
  • XFire:http://dist.codehaus.org/xfire/update/
  • ASMifier & Bytecode Outline: http://download.forge.objectweb.org/eclipse-update/

留言

尝试着写了一个Google Gadget

Google Gadget是可以添加在Google自定义的个人主页上面的一个一个的小窗口,里面的内容可以自行开发,目前可以在Gadget的目录上面看到很多的Gadgets。这些都是可以由第三方来开发的。

我选的例子是调用Yahoo!的搜索服务,因为它的搜索的返回结果可以是JSON格式的,不受到Cross-domain policy的制约,可以很容易的使用。只是简单的拷贝了Yahoo! Web Services SDK下面的Javascript的实现,并按照Google Gadget的格式进行了修改,就完成了。

感兴趣的朋友可以试试看:Add to Google

留言

攒出来了一个分词软件的在线版本

当然了,分词软件本身不是我做的,那超出了我的能力范围。由于我本科的毕业设计是关于命名实体识别(Named Entity Recognition)的,所以当时就用到了一个分词程序。也不是完整的程序,只是2个DLL文件而已,我当时的做法就是写了一个C++程序来调用分词程序就可以对一段文章进行分词。而我这个版本只是把调用方式从C++改成了用Java本地方法调用(JNI)来实现而已,并用Spring加上一个Web应用的外壳罢了。

其实JNI本身还是有点复杂的,关键是那些类型比较麻烦,比如jstring, jobjectarray。一旦弄清楚了如何在C++的数据类型和Java类型之间如何转换,使用JNI就是非常容易的事情了。另外一个问题就是DLL放在什么地方的问题,这似乎同应用服务器有关系。我最开始用的是Jetty,这个时候即可以在启动Jetty的时候使用-Djava.library.path来显式指定DLL的目录,也可以直接把DLL放在JDK的bin目录下面。第三方的DLL(比如分词的DLL)就可以放在Jetty的安装根目录下面。后来换到了Tomcat,Tomcat的DLL放法就比较简单了,把相关的DLL都放在Tomcat安装目录的bin下面就可以了。

截图如下:

segonline1.JPG

留言

我做SCJP模拟器(3)

刚才又抽时间做了一套practice,45分钟,准确率46/61。

这次有好几个错的都是没仔细看清楚题目,过分追求速度了。

几处错的地方:

  • 如果一个方法有接受String和StringBuffer两者类型参数的overloading,则无法通过编译。
  • 子类override父类的方法,必须抛出相同的异常,或是父类异常的子类,也可以不抛出异常。

 

留言

读写ATOM feed的库

今天看来TSS的newsletter,里面介绍了一些常见的读写ATOM feed的Java库,现在记录下来,以备以后使用。

留言

Joshua Bloch关于API设计的keynote

API设计的过程

  • Gather Requirements–with a Healthy Degree of Skepticism:以use cases的形式。
  • Start with Short Spec–1 Page is Ideal:让越多的人参与越好,随着信心的增加不断扩充。
  • Write to Your API Early and Often:在实现API之前,在描述之前,扩充之后继续编写
  • Writing to SPI is Even More Important:在发布之前先写至少3个插件
  • Maintain Realistic Expectations:多数API设计都限制过多,有犯错误的心理准备

通用原则

  • API Should Do One Thing and Do it Well:功能应该容易说明
  • API Should Be As Small As Possible But No Smaller:有疑问的时候就忽略,追求power-to-weight比
  • Implementation Should Not Impact API:不要让实现细节泄漏到API中
  • Minimize Accessibility of Everything:最大化信息隐藏
  • Names Matter–API is a Little Language:名字应该是顾名思义的;一致的;代码应该像散文
  • Documentation Matters
  • Document Religiously:仔细的说明状态空间
  • Consider Performance Consequences of API Design Decisions:坏的决策影响性能;不要wrap API来获取性能
  • Effects of API Design Decisions on Performance are Real and Permanent
  • API Must Coexist Peacefully with Platform

类设计

  • Minimize Mutability:如果只能是mutable的,保证小的状态空间
  • Subclass Only Where It Makes Sense:不能为了容易实现,就让一个Public类继承另外一个Public类。
  • Design and Document for Inheritance or Else Prohibit it:继承违背了封装

方法设计

  • Don’t Make the Client Do Anything the Module Could Do
  • Don’t Violate the Principle of Least Astonishment
  • Fail Fast–Report Errors as Soon as Possible After They Occur:编译时刻最好;运行时刻,第一次坏方法调用的时候
  • Provide Programmatic Access to All Data Available in String Form:否则,客户端代码必须解析字符串
  • Overload With Care:避免模糊的overloadings;如果必须提供,保证相同的参数有相同的行为
  • Use Appropriate Parameter and Return Types:Favor interface types over classes for input;Use most specific possible input parameter type;Don’t use string if a better type exists;Don’t use floating point for monetary values;Use double (64 bits) rather than float (32 bits)
  • Use Consistent Parameter Ordering Across Methods
  • Avoid Long Parameter Lists:3个或更少最好
  • Avoid Return Values that Demand Exceptional Processing

异常设计

  • Throw Exceptions to Indicate Exceptional Conditions:不要迫使客户端代码使用异常来控制流程;不要悄无声息的失败
  • Favor Unchecked Exceptions
  • Include Failure-Capture Information in Exceptions

 

留言

Eclipse CDT的使用

从Eclipse CDT的网站上下载下来CDT,或者直接用Update Manager在线更新,下载之后就可以编写C++程序了,不过如果使用GCC编译的话,Windows下可以使用Cygwin,到Cygwin的网站上下载安装文件,该安装是在线进行的,选择的包至少包括GCC和Make。

留言

Python Moving into the Enterprise (from Slashdot)

Python,会这门语言的人可能真的不是很多。按照Slashdot上面的文章的说法,Python正日益成为企业开发的一种选择甚至是首选语言,其推动者包括Google, Nokia和Microsoft。

留言

« Previous entries