热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Nutch0.8笔记Google式的搜索引擎实现

作者:江南白衣Nutch是一个基于Lucene,类似Google的完整网络搜索引擎解决方案,基于Hadoop的分布式处理模型保证了系统的性

  作者:江南白衣

    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 &#61; 0; i < hits.getLength(); i&#43;&#43;) {
      Hit hit 
&#61; hits.getHit(i);
      HitDetails details 
&#61; bean.getDetails(hit);

      String title 
&#61; details.getValue("title");
      String url 
&#61; details.getValue("url");
      String summary 
&#61;bean.getSummary(details, query);
    }

这里NutchBean为我们做了几样事情&#xff1a;

一是按Title field来排序。

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

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

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

3. 修改源码或编写插件

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

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

&#61;"index-basic"   version&#61;"1.0.0"   provider-name&#61;"nutch.org">
   
      &#61;"index-basic.jar">
         &#61;"*"/>
      
   

   
      &#61;"nutch-extensionpoints"/>
   

   &#61;"org.apache.nutch.indexer.basic"
             name
&#61;"Nutch Basic Indexing Filter" 
             point
&#61;"org.apache.nutch.indexer.IndexingFilter">
      &#61;"BasicIndexingFilter"  class&#61;"org.apache.nutch.indexer.basic.BasicIndexingFilter"/>
   




最后是八卦&#xff0c;Dedian同志翻译的Doug Cutting 访谈录 -- 关于搜索引擎的开发
最最后&#xff0c;感谢创造 "C&#43;&#43; 必知必会" 这个短语的译者:)

 

 

转自 http://www.tzsy.cn/blog/146/viewspace-43255.html

 

 

http://wiki.apache.org/nutch/NutchTutorial

配置环境&#xff1a;Debian 4 (kernel 2.4)

配置软件&#xff1a;
1,  Java jdk-1.5
1,1 下载安装
apt-get install sun-java5-jdk

1,2 修改环境变量
vi /etc/profile
在末尾加上
QUOTE:
JAVA_HOME&#61;/usr/lib/jvm/java-1.5.0-sun-1.5.0.10
CLASSPATH&#61;.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH&#61;$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

export PATH
export JAVA_HOME
export CLASSPATH

1,3 测试
java -version

2,  tomcat-5.5
2,1 下载
from:http://tomcat.apache.org/
wgethttp://mirror.olnevhost.net/pub/... omcat-5.5.23.tar.gz

2,2 在/opt目录下解压&#xff08;顺便哪都行&#xff0c;放到/opt下比较整齐&#xff09;
安装目录&#xff1a;/opt/tomcat5.5

2,3 修改配置
vi conf/server.xml
QUOTE:
 
                maxThreads&#61;"150" minSpareThreads&#61;"25" maxSpareThreads&#61;"75"
               enableLookups&#61;"false" redirectPort&#61;"8443" acceptCount&#61;"100"
               c disableUploadTimeout&#61;"true"
               URIEncoding&#61;"UTF-8" useBodyEncodingForURI&#61;"true" />   

默认服务端口为8080&#xff0c;若有冲突&#xff08;如Apache&#xff09;&#xff0c;则可通过此配置文件更改端口&#xff08;蓝色&#xff09;
如果配置后nutch出现中文乱码问题&#xff0c;则增加编码配置&#xff08;红色&#xff09;

2,4 启动服务
/opt/tomcat5.5/bin/startup.sh

2,5 题外话
Debian下可通过 apt-get install tomcat5.5 来安装&#xff0c;
默认安装后路径为 /usr/share/tomcat5.5
并且增加到服务 /etc/init.d/tomcat5.5
注意&#xff0c;此时webapps目录并不在安装路径&#xff0c;而在/var/lib/tomcat5.5/webapps/
初始时该目录并无内容&#xff0c;所以访问时会出现 http 400 错误的请求&#xff0c;只需在该路径放置web应用就可。
&#xff08;在使用这种方式安装tomcat后&#xff0c;nutch老是没法运行&#xff0c;改成上面的安装就可以&#xff0c;不知是什么问题&#xff09;

3,  nutch-0.9
3,1 下载http://lucene.apache.org/nutch/

3,2  解压后&#xff0c;建立目录&#xff0c;建 urls/nutch.txt文件&#xff0c;指定爬取列表
mkdir urls
vi urls/nutch.txt
写入要爬取的网站&#xff0c;这里实验南开bbs
QUOTE:
http://bbs.nankai.edu.cn

3,3  指定爬虫规则
vi conf/crawl-urlfilter.txt
QUOTE:
# accept hosts in MY.DOMAIN.NAME
#&#43;^http://([a-z0-9]*/.)*MY.DOMAIN.NAME/

把这里改成你要的域名
如 &#43;^http://bbs.nankai.edu.cn/

如果爬取网站的url含有以下过滤字符&#xff0c;如 ? 和 &#61; &#xff0c;而你又需要这些访问&#xff0c;可以更改过滤表
QUOTE:
# skip URLs containing certain characters as probable queries, etc.
-[?*!&#64;&#61;]

改为
-[*!&#64;]

3,4 修改 conf/nutch-site.xml
QUOTE:

       
                http.agent.name
                HD nutch agent
       

       
                http.agent.version
                1.0
       

如果没有配置此agent&#xff0c;爬取时会出现 Agent name not configured! 的错误。

3.5 开始爬取
可以指定不同的抓去深度&#xff0c;线程数&#xff0c;
bin/nutch crawl urls -dir NKBBS -depth 50 -threads 5 -topN 1000
爬取索引完成后&#xff0c;结果生成在设定的目录中&#xff0c;这里是NKBBS

3,6 部署web前端
将 nutch-0.9.war 拷贝到webapps目录下
cp nutch-0.9.war /opt/tomcat5.5/webapps/
通过浏览器访问http://localhost:8080/nutch-0.9/后&#xff0c;war包自解压。

3,7 修改nutch的web配置
vi /opt/tomcat5.5/webapps/nutch-0.9/WEB-INF/classes/nutch-site.xml
将内容更改为索引生成的目录。
QUOTE:

       
                searcher.dir
                /home/northtree/SearchEngine/nutch-0.9/NKBBS/
       

 

 

转自 http://www.tzsy.cn/blog/146/viewspace-43268.html


推荐阅读
  • 部署solr建立nutch索引
    2019独角兽企业重金招聘Python工程师标准接着上篇nutch1.4的部署应用,我们来部署一下solr,solr是对lucene进行了封装的企 ... [详细]
  • 本文深入探讨了如何利用Maven高效管理项目中的外部依赖库。通过介绍Maven的官方依赖搜索地址(),详细讲解了依赖库的添加、版本管理和冲突解决等关键操作。此外,还提供了实用的配置示例和最佳实践,帮助开发者优化项目构建流程,提高开发效率。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • Parallels Desktop 10 是一款功能强大的虚拟化软件,专为 Mac 用户设计,使其能够无缝运行 Windows 应用程序。该软件不仅显著提升了图形应用的性能,还优化了演示效果。对于需要在 Mac 上高效运行 Windows 程序的用户来说,Parallels Desktop 10 是一个理想的选择。本文将介绍如何获取其激活码及免费下载渠道,帮助用户轻松激活并使用这一强大工具。 ... [详细]
  • Hadoop平台警告解决:无法加载本机Hadoop库的全面应对方案
    本文探讨了在Hadoop平台上遇到“无法加载本机Hadoop库”警告的多种解决方案。首先,通过修改日志配置文件来忽略该警告,这一方法被证明是有效的。其次,尝试指定本地库的路径,但未能解决问题。接着,尝试不使用Hadoop本地库,同样没有效果。然后,通过替换现有的Hadoop本地库,成功解决了问题。最后,根据Hadoop的源代码自行编译本地库,也达到了预期的效果。以上方法适用于macOS系统。 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • 在安装并配置了Elasticsearch后,我在尝试通过GET /_nodes请求获取节点信息时遇到了问题,收到了错误消息。为了确保请求的正确性和安全性,我需要进一步排查配置和网络设置,以确保Elasticsearch集群能够正常响应。此外,还需要检查安全设置,如防火墙规则和认证机制,以防止未经授权的访问。 ... [详细]
  • 如何理解MyBatis动态SQL
    本篇内容主要讲解“如何理解MyBatis动态SQL”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解M ... [详细]
  • Hbase 的伪分布部署、shell基本操作及hbase相关理念
    1,HBase的的的的伪分布式配置-对zookeeper的配置,这个前面配置过,修改zoo.cfg文件,指定zookeeper的主入口-配置的HBase的的:进入optmo ... [详细]
  • POI编程
    POI编程1简介在我们实际的开发中,表现层的解决方案虽然有多样,但是IE浏览器已成为最多人使用的浏览器,因为大家都用Windows。在企业办公系统中 ... [详细]
  • 1.0为什么要做这个博客站?  在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满了。而且下次再点击这个书签时,可能就会忘记当时为什么要添加这个书签了,更有可能书签连接已经无效。这样一来,也就不方便 ... [详细]
  • camel_使用Camel在来自不同来源的Solr中索引数据
    camelApacheSolr是建立在Lucene之上的“流行的,快速的开源企业搜索平台”。为了进行搜索(并查找结果),通常需要从不同的源(例如内容管理 ... [详细]
  • 学习mybatis的基础知识:mybatis入门教程(二)
    2019独角兽企业重金招聘Python工程师标准2.3MyBatisprintsql在log4j.properties配置文件中添加如下配置,让mybatis打 ... [详细]
  • springboot日志【转】【补】
     市面上的日志框架日志门面(日志的抽象层)日志实现JCL(JakartaCommonsLogging)(2014)SLF4j(SimpleLoggingFacadeforJava) ... [详细]
author-avatar
慈禧太后她妈_151
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有