Google式的搜索引擎实现

标签: google 搜索引擎 | 发表时间:2014-06-22 23:31 | 作者:talentluke
出处:http://www.iteye.com

Nutch是一个基于Lucene,类似Google的完整网络搜索引擎解决方案,基于Hadoop的分布式处理模型保证了系统的性能,类似Eclipse的插件机制保证了系统的可客户化,而且很容易集成到自己的应用之中。

  Nutch 0.8 完全使用Hadoop重写了骨干代码,另有很多地方作了合理化修正,非常值得升级。

  

1.Nutch 0.8 的安装与运行

 

  nutch 0.7.2的中文安装文档满街都是,nutch 0.8的安装文档见Tutorial (0.8) , 要注意两点:

  一是 crawl命令里的urls参数从指定文件变为了指定目录, 即原来的urls 要改存到urls/foo 里。

  二是 nutch-default.xml里http.agent.name属性默认为空,必须在nutch-site.xml中为该属性设值,否则会出错。

  注意nutch 爬行时的信息用log4j输出在/logs 目录下了,默认不再直接输出到屏幕,除非你在配置文件里设fetcher.verbose为true。

  Luke(http://www.getopt.org/luke) 是一个必备的索引阅读工具。

  另外,nutch需要在unix下奔跑,如果要装在windows上,大家可以先装个cygwin。(下载它的setup.exe 在线安装很快装完)。

  最后,nutch 0.8的recawl 脚本也不同了。

  

2.Nutch You should know 

2.1 一份文档

 

  nutch的文档不多,而且多是安装文档,要深入nutch,就必须一字不漏的阅读:

  Introduction to Nutch, Part 1 Crawling  和 Introduction to Nutch, Part 2 Searching

  然后就是看源码了,好在nutch的源码非常均匀,简短,没有花哨的技巧,很容易把事情看明白。

  

2.2 三个目录

 

  首先理解nutch的三个数据目录:

  1.crawdb,linkdb 是web link目录,存放url 及url的互联关系,作为爬行与重新爬行的依据,页面默认30天过期。

  2.segments 是主目录,存放抓回来的网页。页面内容有bytes[]的raw content 和 parsed text的形式。nutch以广度优先的原则来爬行,因此每爬完一轮会生成一个segment目录。

  3.index 是lucene的索引目录,是indexs里所有index合并后的完整索引,注意索引文件只对页面内容进行索引,没有进行存储,因此查询时要去访问segments目录才能获得页面内容。

  

2.3 爬行过程

 

  爬行过程在Introduction to Nutch, Part 1 Crawling 里已有详细说明,或许直接看Crawl类来理解爬行的过程。

  这里有一幅更直观的图:

  

  Nutch用入口地址,地址正则表达式,搜索深度三种形式来限制。

  因为使用了Hadoop(下篇再讲),Nutch的代码都按照Hadoop的模式来编写以获得分布式的能力,因此要先了解一下Hadoop,明白它Mapper,Reducer, InputFormat, OutputFormat类的作用才能更好的阅读。

  1.Fetcher类, 在run()里多线程运行FetcherThread,并调用恰当的Protocol插件(支持http,ftp等协议)获取内容,调用恰当的Parser将内容(html,pdf,excel)分析为文本,然后把内容放到FetcherOutput类里,最后由FetcherOutputFormat类定义写盘到segments的过程。

  2.Indexer类,使用hadoop遍历所有segments 目录,将parseData文件序列化成ParseData类,从中获得各种资料然后调用插件进行索引,最后仍然由ouputFormat类完成写入索引的工作。

  注意,如果你仅想使用Nutch的爬虫,而不是其索引功能,可以仿照Indexer重写自己的实现,比如把segments内容直接搬进数据库。

  3.Nutch 每条索引记录的字段

  url: 作为唯一标标识值,由BasicIndexingFilter类产生。

  segment:由Indexer类产生。Nutch抓回来的页面内容放在segments目录,lucene只会索引,不会store原文内容,因此在查询时要以segment与url作为外键,由FetchedSegments类根据hitsDetail从segments目录获得content。

  boost:优先级,由Indexer类调用插件计算产生。

  title:显示标题,在BasicIndexingFilter插件中被索引和存储。

  content: 主要的被搜索项,在BasicIndexingFilter插件中被索引。

  

2.4 搜索过程

 

  Nutch提供了一个Fascade的NutchBean类供我们使用,一段典型的代码如下

  

 
    NutchBean bean = new NutchBean();

 

  Query query = Query.parse(args[0]);

  Hits hits = bean.search(query, NUM_HITS,"title",true);

  for (int i = 0; i < hits.getLength(); i++) {

  Hit hit = hits.getHit(i);

  HitDetails details = bean.getDetails(hit);

  String title = details.getValue("title");

  String url = details.getValue("url");

  String summary =bean.getSummary(details, query);

  }

  

这里NutchBean为我们做了几样事情:

 

  一是按Title field来排序。

  二是支持分布式查询,如果有配置servers,就会使用hadoop的IPC系统,调用所有server上的nutchBeans,最后规约出总的结果。

  三是每个站点像Google一样只显示分数最高的一页,如果用户还想看同站的其他结果,就需要进一步调用API访问。

  四是生成Summary,从segments目录按segments和url 获得content, 并按一定算法抽取出像Google一样的包含关键字的文档片断。

  

3. 修改源码或编写插件

 

  Nutch的源码很容易修改和重新编译,注意新编译的class要压回nutch-0.8.job(实际是一个jar)才能生效。

  Nutch的插件机制及度类似Eclipse, 详看http://wiki.apache.org/nutch/WritingPluginExample,只要实现某个插件接口,然后在plugins.xml里定义class,扩展点和依赖的jar,如

  

<plugin   id="index-basic"   version="1.0.0"   provider-name="nutch.org">

 

  <runtime>

  <library name="index-basic.jar">

  <export name="*"/>

  </library>

  </runtime>

  <requires>

  <import plugin="nutch-extensionpoints"/>

  </requires>

  <extension id="org.apache.nutch.indexer.basic"

  name="Nutch Basic Indexing Filter" 

  point="org.apache.nutch.indexer.IndexingFilter">

  <implementation id="BasicIndexingFilter"  class="org.apache.nutch.indexer.basic.BasicIndexingFilter"/>

  </extension>

  </plugin>

 

 

参考 https://today.java.net/pub/a/today/2006/01/10/introduction-to-nutch-1.html

https://today.java.net/pub/a/today/2006/02/16/introduction-to-nutch-2.html



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [google 搜索引擎] 推荐:

Google式的搜索引擎实现

- - 行业应用 - ITeye博客
Nutch是一个基于Lucene,类似Google的完整网络搜索引擎解决方案,基于Hadoop的分布式处理模型保证了系统的性能,类似Eclipse的插件机制保证了系统的可客户化,而且很容易集成到自己的应用之中.   Nutch 0.8 完全使用Hadoop重写了骨干代码,另有很多地方作了合理化修正,非常值得升级.

Google Plus 第三方搜索引擎:Google Plus Search

- 老男人 - cnBeta.COM
Google Plus 目前仍在 beta  版状态,而针对 Google Plus 的官方搜索应用至今没有推出. 用户需要搜索 Google+ 上的东西,需要手动在 Google 搜索框里加上 "关键字 site:plus.google.com",不是特别方便. 目前有一些非官方的 Google Plus 搜索应用,例如 Google Plus Search.

第三方 Google+ 搜索引擎 Google Plus Search

- Ivy - 谷奥——探寻谷歌的奥秘
Google Plus 目前仍在 beta  版状态,而针对 Google Plus 的官方搜索应用至今没有推出. 用户需要扫过 Google+ 上的东西,需要手动在 Google 搜索框里加上 "关键字 site:plus.google.com",不是特别方便. Google Plus Search  是一个非官方的 Google Plus 搜索应用,支持中文.

给浏览器添加SSL加密的Google搜索引擎

- Sam - cnBeta.COM
今天 Google 宣布其搜索引擎也开始支持 SSL 加密传输,以更好地保障用户的数据安全,当然一定程度上也缓解了国内使用Google搜索经常被重置的现象. 下面我介绍一下怎样在主流的浏览器上使用 SSL 加密的Google搜索,包括 IE,Firefox,Chrome,Opera,需要注意的是,如果被转入google.com.hk,请选择主页下的 Go to Google.com ,之后可以正常使用.

Google公布调整搜索引擎算法的细节

- tt5ryan - Solidot
淘宝网女装秋装 写道 "尽管Google拥有很多开放的产品和项目,但搜索引擎算法一直是保密的. 换句话说,搜索是Google的一个黑盒子. Google此前表示,如果Google向外界公布搜索引擎算法,那么将会引起搜索结果排序的混乱. 但Google周五在官方博客上发布了一则视频,视频给出了Google工程师调整搜索引擎算法的细节.

Bing 利用自己的搜索引擎暗讽 Google 邪恶

- HaWk - cnBeta.COM
今天Google软件工程师Andy Arnt爆料称在Bing里输入两个搜索关键字,即可看到暗讽Google的搜索结果OneBox. 两个关键字分别是:more evil than satan himself(比撒旦本人还邪恶,如上图):.

九月美国搜索引擎市场Google略有上升

- ArmadilloCommander - Solidot
深圳SEO 写道 "comScore周三发布了(中文)全美九月份美国搜索引擎市场份额报告,Google仍占主导,从64.8%增加到65.3%;雅虎从16.3%降至15.5%; 虽然Bing与Facebook有搜索业务的合作关系,但是Facebook并没有给微软的搜索份额带来显著的提高,名列第三,它的份额仍然是14.7%.

微软和Google如何让搜索引擎理解互联网

- - Solidot
搜索引擎爬虫抓取和索引了海量的网页内容,但内容的意义则是一无所知,它们并不能像人类那样区分同一个词的不同含义. 它们抓取的只是网页中的单词,而不是语义. 从一开始,搜索引擎本质上是匹配文本字符串. 让字符串和语义匹配起来是搜索引擎公司努力实现的方向,微软和Google正更新其搜索引擎:微软的Satori和Google的Knowledge Graph能提取出网页中的非结构性数据,创造一个互联网“名词”——人、位置、物及彼此关系——的结构性数据库.

叫板Google,YaCy发布开源搜索引擎

- 洋白菜 - 36氪
一个名叫YaCy的项目要在搜索市场上向Google叫板,放出了一个开源搜索引擎,在互联网和内联网皆可使用. YaCy引擎基于点对点连接,而不是通过中央服务器进行搜索查询. 用户下载该软件后就可以进行搜索,保证内容不被审查、搜索结果不会被中央服务器记录和分析. “我们在网络上的大多数行为都和搜索有关,这是我们和所要信息的关键一环.

针对Google与百度搜索引擎的优化

- - 网站运营优化
  从实践上来看,只要抓住seo的根本原理,做好基础优化,一般来说在所有搜索引擎中排名都会不错. 不通搜索引擎算法上的细微差别造成排名不通是正常的. 但对于一个真正优秀的网站来说,不会有天壤之别的.   百度和google的区别:在收录方面,google很容易收录新网站和新页面,一两个质量不必很高的外部连接,就能让新网站收录.