搜索相关笔记(Nutch)

q985962490 贡献于2012-02-29

作者 zhanghua  创建于2006-04-29 01:44:00   修改者zhanghua  修改于2009-04-30 06:44:00字数13242

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

搜索相关笔记 quqi99@163.com 1 Nutch(windows环境下) Nutch是一个基于Lucene,类似Google的完整网络搜索引擎解决方案,基于Hadoop的分布式处理模型保证了系统的性能,类似Eclipse的插件机制保证了系统的可客户化,而且很容易集成到自己的应用之中。Nutch 0.8 完全使用Hadoop重写了骨干代码,另有很多地方作了合理化修正,非常值得升级。 1.1 Nutch安装 参考资料:http://www.blogjava.net/dev2dev/archive/2006/02/01/29415.aspx Nutch在Windows中安装之细解 由于运行Nutch自带的脚本命令需要Linux的环境,所以必须首先安装Cygwin来模拟这种环境。 1)安装cgwin 2) 下载nutch-0.9.tar.gz, 用winrar解压后,例如放在g:/nutch-0.9 3) 安装nutch,打开cgwin,运行命令: cd /cygdrive/g/nutch-0.9 (也就是进入nutch解压的目录) bin/nutch (执行nutch脚本安装) 4) OK ! 1.2 Nutch使用入门 资料:http://blog.csdn.net/zjzcl/archive/2006/02/06/593138.aspx Nutch 使用之锋芒初试 (包括下载及检索两部分) 注意:请使用JDK1.5,用JDK1。4会报错误:unsupported major.minor version 49.0 n 设置环境变量:NUTCH_JAVA_HOME = c:/jdk1.5 1.2.1 抓取少量网站 1) 在nutch的安装目录新建一个文件url.txt,指明要抓取网站的顶级网址,写入: http://www.aerostrong.com.cn 2) 编辑conf/crawl-urlfilter.txt,修改MY.DOMAIN.NAME部分 # accept hosts in MY.DOMAIN.NAME #+^http://([a-z0-9]*\.)*MY.DOMAIN.NAME/ +^http://www.aerostrong.com.cn 改配置文件还能设置更多相关信息,比如如下,设定那些文件不被抓取 # skip image and other suffixes we can't yet parse -\.(gif|GIF|jpg|JPG|png|PNG|ico|ICO|css|sit|eps|wmf|zip|ppt|mpg|xls|gz|rpm|tgz|mov|MOV|exe|jpeg|JPEG|bmp|BMP|rar|RAR|js|JS)$ 修改D:\nutch-0.9\conf\nutch-site.xml,具体为什么加这个我也说不清楚,但尝试了几次,如果不加就会抓不到数据。      http.agent.name      * 3) 运行脚本命令抓取,脚本命令全是linux下的shell命令,在window下运行它需要cgwin,打开cgwin,运行命令: cd /cygdrive/g/nutch-0.9 (也就是进入nutch解压的目录) bin/nutch crawl url.txt -dir crawled -depth 3 -threads 4 >& crawl.log 参数解释:(不加日志,日志就写到控制台上) -dir dir names the directory to put the crawl in. -depth depth indicates the link depth from the root page that should be crawled. -delay delay determines the number of seconds between accesses to each host. -threads threads determines the number of threads that will fetch in parallel. 生成的目录: l crawdb,linkdb 是web link目录,存放url 及url的互联关系,作为爬行与重新爬行的依据,页面默认30天过期。 l segments 是主目录,存放抓回来的网页。页面内容有bytes[]的raw content 和 parsed text的形式。nutch以广度优先的原则来爬行,因此每爬完一轮会生成一个segment目录。 l index 是lucene的索引目录,是indexs里所有index合并后的完整索引,注意索引文件只对页面内容进行索引,没有进行存储,因此查询时要去访问segments目录才能获得页面内容。 简单测试:在cygwin中输入”bin/nutch org.apache.nutch.searcher.NutchBean aaaa”, 1.2.2 抓取整个因特网 http://hedong.3322.org/archives/000247.html 试用nutch 1、概念解释: 1) web database: nutch所知道的page,以及在这些page里头的links (由injector通过DMOZ往里添加page,Dmoz(The Open Directory Project/ODP)是一个人工编辑管理的目录集合,为 搜索引擎提供结果或数据。) WebDB存储的内容有(url、对内容的MD5摘要、Outlinks ,page的link数目、抓取信息,可决定是否重新抓取,Page的score,决定页面的重要性) 2) segments.:是指page的一个集合,对它进行抓取与索引都作为同一个单元对待。它包含以下类型: Fetchlist 这些page的名称的集合 Fetcher output: 这些page文件的集合 Index: lucene格式的索引输出 2、 建立web database与segments http://lucene.apache.org/nutch/tutorial8.html 初始准备 mkdir db 建立目录存放web database mkdir segments bin/nutch admin db -create 建一个新的空的数据库(这步出错了) 改用先下载wget下载工具,然后: wget http://rdf.dmoz.org/rdf/content.rdf.u8.gz 来下载dmoz,然后解压:gunzip content.rdf.u8.gz mkdir dmoz bin/nutch org.apache.nutch.tools.DmozParser content.rdf.u8 -subset 5000 > dmoz/urls bin/nutch inject crawl/crawldb dmoz 第一轮抓取 bin/nutch inject db -dmozfile content.rdf.u8 -subset 3000 从DMOZ列表中取得URL并加入数据库 bin/nutch generate db segments 根据数据库内容,生成一个抓取列表(fetchlist) s1=`ls -d segments/2* | tail -1` 刚才生成的抓取列表放在最后一个目录中,取其名 bin/nutch fetch $s1 利用机器人抓页面 bin/nutch updatedb db $s1 利用抓取结果更新数据库 第二轮抓取 bin/nutch analyze db 5 迭代5次分析页面的链接 bin/nutch generate db segments -topN 1000 将排行前1000个URL生成新的抓取列表 s2=`ls -d segments/2* | tail -1` 执行抓取、更新、并迭代2次分析链接 bin/nutch fetch $s2 bin/nutch updatedb db $s2 第三轮抓取 bin/nutch analyze db 2 bin/nutch generate db segments -topN 1000 s3=`ls -d segments/2* | tail -1` bin/nutch fetch $s3 bin/nutch updatedb db $s3 bin/nutch analyze db 2 (为下一次做准备?) 索引并去重 bin/nutch index $s1 bin/nutch index $s2 bin/nutch index $s3 bin/nutch dedup segments dedup.tmp 1. Create a new WebDB (admin db -create). 2. Inject root URLs into the WebDB (inject). 3. Generate a fetchlist from the WebDB in a new segment (generate). 4. Fetch content from URLs in the fetchlist (fetch). 5. Update the WebDB with links from fetched pages (updatedb). 6. Repeat steps 3-5 until the required depth is reached. 7. Update segments with scores and links from the WebDB (updatesegs). 8. Index the fetched pages (index). 9. Eliminate duplicate content (and duplicate URLs) from the indexes (dedup). 10. Merge the indexes into a single index for searching (merge). 1.2.3 抓取本地文件系统 1.2.4检索 1) 将nutch-0.9.war包丢到tomcat发布目录 2) 修改配置文件指定索引库.( WEB-INF\classes下的nutch-site.xml):                searcher.dir     G:/nutch-0.9/crawled        注意,当复制上述配置文件时,如果出现下列错误,是因为复制文件时带有空格或编码格式,重敲一遍即可: java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequence 3) 测试http://172.17.1.122:8081 注意,若查询字符串输出中文时出现编码问题,这个问题和nutch关系不大,主要是tomcat有关系,修改tomcat的server.xml,在Connector元素中增加属性: URIEncoding="UTF-8" useBodyEncodingForURI="true" 1.2.4.1 用search API http://today.java.net/pub/a/today/2006/02/16/introduction-to-nutch-2.html Introduction to Nutch, Part 2: Searching 1.2.5 配置 配置文件均在conf目录下。 主配置文件是nutch-default.xml,一般不需要修改它;若要修改,在nutch-site.xml中修改。 Nutch提供很多扩展点,可由我们写插件去扩展它的功能(在plugins子目录)。即使是parsing和indexing功能也是由插件提供的。 例如,修改日志输出到console,修改fetcher.verbose=true 1.2.6 命令 cd /cygdrive/g/nutch-0.9 1 抓取: Bin/nutch crawl urls –dir crawl-tiynysite –depth 3 >& crawl.log 2 检索WebDB中链接数 Bin/nutch readdb crawl-tinysite/crawldb –stats (crawldb是DB名) 3 Bin/nutch readdb crawl-tinysite/crawldb –stats –dumppageurl 1.3 nutch的二次开发 参考: http://www.mysoo.com.cn/news/2007/200721679.shtml Google式的搜索引擎实现 http://today.java.net/pub/a/today/2006/01/10/introduction-to-nutch-1.html Introduction to Nutch, Part 1: Crawling http://today.java.net/pub/a/today/2006/02/16/introduction-to-nutch-2.html Introduction to Nutch, Part 2: Searching 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插件中被索引。    搜索过程   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一样的包含关键字的文档片断。    修改源码或编写插件   Nutch的源码很容易修改和重新编译,注意新编译的class要压回nutch-0.8.job(实际是一个jar)才能生效。  Nutch的插件机制及度类似Eclipse, 详看http://wiki.apache.org/nutch/WritingPluginExample,只要实现某个插件接口,然后在plugins.xml里定义class,扩展点和依赖的jar,如                                        1.3.1 Hadoop(windows环境下) 1 安装 windows下的hadoop的分布部署主要有两种方式: l 采用cygwin模拟linux下命令的方式,部署安装hadoop系统. l 修改系统的代码文件DF.java使其可以在windows下运行. 主要原因在于,在hadoop的代码中对数据节点的磁盘使用情况的获取采用了linux下的df -k 命令进行获取 而在windows没有此命令支持,因此在数据节点启动DataNode时会产生启动进程异常错误 .解决的方法在hadoop的网站上已说明.具体参看. http://issues.apache.org/jira/browse/HADOOP-33?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel 基本上是找到相应的替换命令获取磁盘空间,在window xp以及2003下采用fsutil命令获取磁盘情况即可. 需要注意的是:在上面的网址中提供的方法还有一个问题需要解决,获取磁盘命令获取到的信息.对于操作系统的不同语言版本获取的磁盘信息前缀信息也不一样,所以对于不同的操作系统不同的语言版本可以根据需要做修改. http://lucene.apache.org/hadoop/api/overview-summary.html#overview_description hadoop在linux环境下的安装: http://www.cublog.cn/u/4764/showart.php?id=282440 Getting Started with Hadoop, Part 1 在cgwin下运行bin/hadoop dfs –ls命令时同样像在cgwin中运行nutch时报同样的错:NoClassDefFoundError 3 代码学习 http://blog.csdn.net/kauu/archive/2006/12/10/1437216.aspx hadoop 学习 吴志敏的专栏 4 linux shell学习 1 #! Shell解释器路径 2 命名例为zh.sh, 还要赋权限(chmod +x zh.sh)才能执行(./zh.sh) 3 变量声明:变量=值 4 引用变量:前加一个$, 或者${ } 5 执行表达式 expr 6 声明表达式 let 7 条件判断。Shell中0表示真,非0表示假,与C语言刚好相反。 格式是 test condition或者是[ ] 与 –a 或 –o !非 常用文件属性判断: -f fn 如果fn存在且fn为普通文件则返回真,否则返回假 -d fn 如果fn存在且fn为目录则返回真,否则返回假 常用字符串属性判断: -z string 字符串长度为0则为真 -n string字符串长度不为0则为真 常用整数关系条件判断有: Num1 –eq num2 等于 Num1 –ne num2 不等于 8 if语句 if 条件1 then 命令 [elif 条件2 then 命令] [else 命令] fi 9 case语句 case 条件 in 模式n) 命令n ;; Esac 10 for语句 for 变量 [in 列表] do 命令 Done 11 while和until语句 While/until条件 Do 命令 Done 12 函数。用法同javascript 5 开发环境建立 http://wiki.apache.org/nutch/RunNutchInEclipse 下载nutch的源码后,用eclipse新建一个项目,记住要选择第二项,即通过ant builderfile 创建,然后选择nutch里的builderfile,这样就创建好一个项目了。创建好项目后还没完成,要将nutch中的其他目录和文件import到你的项目,目录结构很重要,保持与您下载的源码一致。然后您就可以用ant 进行编译或打包了。   nutch-0.7.1.war应当改为ROOT.war,tomcat会自动创建ROOT目录并将其解压到ROOT目录。 一定要记得将conf目录添加到classpath中。 还有在nutch-site.xml文件中添加: plugin.folders plugins Directories where nutch plugins are located. Each element may be a relative or absolute path. If absolute, it is used as is. If relative, it is searched for on the classpath.   1.4 其他工具 1.4.1 Luke Luke(http://www.getopt.org/luke) 是一个必备的索引阅读工具。 资料 Nutch相关资料收集整理 http://www.gispark.com/html/spatial/2006/1008/294.html 2 Jena WWW上的内容在设计时只考虑到服务于人,而对于语义网而言,它的目的昵语义网内容对自动软件代理或其它计算机工具是可访问和可理解的,完全不需要人的操作。 语义网的目的昵以编码元数据的格式提供指导,编码的元数据提供基于Web数据的上下文。它的目标是将互联网变成一个巨大且分散的计算机可处理的挲据库。数据的所有者可以通过使用标准的HTML访问控制方法决定谁有访问权。同时,作为一个数据使用者,你可以指出自己信任的资源。即使存在双方强加的限制,任何一个特定的语义网应用程序也可以访问大范围的挲据资源 语义网依靠于“资源描述框架”(RDF,它是一种基于XML元数据语言,为设计人员提供页面描述内容),以及那些彼此之间或与其它已知数据体如何相关的方法。 RDF中数据的基本单位是三个一组,由主语(资源标识符)、谓语(特性、属性或关系)和宾语(另一个资源或文字数据)组成 RDFNode 接口为所有的可以作为一个 RDF 三元组一部分的元素提供了一个公共的基础。Literal 接口表示字面值,例如 “red fish” 或 225,可以被用来作为 {predicate, subject, object} 三元组中的 < object>。Literal 接口提供了将字面值转换为诸如 String,int 和 double 这样的 Java 类型的访问方法。 实现 Property 接口的对象可以作为 {predicate, subject, object} 三元组中的 < predicate>。 Statement 接口表示一个 {predicate, subject, object} 三元组。它也可以被用来作为一个三元组中的 < object>,因为 RDF 允许 statement 嵌套。 实现 Container,Alt,Bag 或 Seq 的对象可以作为三元组中的 < object>。 一个 RDF 非常有用的领域是在 Web 页面中嵌入元数据。这个 RDF 能够被编码为嵌入在 XHTML 页面中的 XML。 一个了解 RDF 的搜索引擎能够使用这些元数据来给出比一个仅仅靠关键字匹配的搜索引擎给出的更加关联的结果。一个了解 RDF 的搜索引擎爬虫能够使用 Jena 来解析 RDF,这由 Model 接口里的 read() 方法来完成,就象以下代码显示的那样(为清晰起见,例外处理已被省略) File f; FileReader fr; Model model; f = new File("C:\\test1.html"); fr = new FileReader(f); model = new ModelMem(); model.read(fr, RDFS.getURI()); 3 Hadoop Hadoop学习笔记一 简要介绍 http://ju.qihoo.com/topframe/dingzhen.php?ju=902931&ml=903192&u=8e410ddc2a9943de3d8bed21cea61e3a&r=902991&d=903117&surl=http%3A%2F%2Fwww.cublog.cn%2Fu%2F4764%2Fshowart.php%3Fid%3D280038 Hadoop学习笔记二 安装部署[转] http://hi.baidu.com/aruizen/blog/item/dfb8ce1bf7b93cd4ad6e7591.html Hadoop--海量文件的分布式计算处理方案http://hi.baidu.com/seekvista/blog/item/c1defb80cbf32ed69023d909.html 其实,Hadoop并不仅仅是一个用于存储的分布式文件系统,而是设计用来在由通用计算设备组成的大型集群上执行分布式应用的框架。 1、 HDFS       即Hadoop Distributed File System (Hadoop分布式文件系统)       HDFS具有高容错性,并且可以被部署在低价的硬件设备之上。HDFS很适合那些有大数据集的应用,并且提供了对数据读写的高吞吐率。HDFS是一个master/slave的结构,就通常的部署来说,在master上只运行一个Namenode,而在每一个slave上运行一个Datanode。       HDFS支持传统的层次文件组织结构,同现有的一些文件系统在操作上很类似,比如你可以创建和删除一个文件,把一个文件从一个目录移到另一个目录,重命名等等操作。Namenode管理着整个分布式文件系统,对文件系统的操作(如建立、删除文件和文件夹)都是通过Namenode来控制。       下面是HDFS的结构:       从上面的图中可以看出,Namenode,Datanode,Client之间的通信都是建立在TCP/IP的基础之上的。当Client要执行一个写入的操作的时候,命令不是马上就发送到Namenode,Client首先在本机上临时文件夹中缓存这些数据,当临时文件夹中的数据块达到了设定的Block的值(默认是64M)时,Client便会通知Namenode,Namenode便响应Client的RPC请求,将文件名插入文件系统层次中并且在Datanode中找到一块存放该数据的block,同时将该Datanode及对应的数据块信息告诉Client,Client便这些本地临时文件夹中的数据块写入指定的数据节点。       HDFS采取了副本策略,其目的是为了提高系统的可靠性,可用性。HDFS的副本放置策略是三个副本,一个放在本节点上,一个放在同一机架中的另一个节点上,还有一个副本放在另一个不同的机架中的一个节点上。当前版本的hadoop0.12.0中还没有实现,但是正在进行中,相信不久就可以出来了。  2、MapReduce的实现       MapReduce是Google 的一项重要技术,它是一个编程模型,用以进行大数据量的计算。对于大数据量的计算,通常采用的处理手法就是并行计算。至少现阶段而言,对许多开发人员来说,并行计算还是一个比较遥远的东西。MapReduce就是一种简化并行计算的编程模型,它让那些没有多少并行计算经验的开发人员也可以开发并行应用。       MapReduce的名字源于这个模型中的两项核心操作:Map和 Reduce。也许熟悉Functional Programming(函数式编程)的人见到这两个词会倍感亲切。简单的说来,Map是把一组数据一对一的映射为另外的一组数据,其映射的规则由一个函数来指定,比如对[1, 2, 3, 4]进行乘2的映射就变成了[2, 4, 6, 8]。Reduce是对一组数据进行归约,这个归约的规则由一个函数指定,比如对[1, 2, 3, 4]进行求和的归约得到结果是10,而对它进行求积的归约结果是24。       关于MapReduce的内容,建议看看孟岩的这篇MapReduce:The Free Lunch Is Not Over!    好了,作为这个系列的第一篇就写这么多了,我也是刚开始接触Hadoop,下一篇就是讲Hadoop的部署,谈谈我在部署Hadoop时遇到的问题,也给大家一个参考,少走点弯路。 对于Hadoop来说,在HDFS看来,节点分为Namenode和Datanode,其中Namenode只有一个,Datanode可以是很多;在MapReduce看来,节点又分为Jobtracker和Tasktracker,其中Jobtracker只有一个,Tasktracker可以是很多。 3.1 Hadoop在Windows下的安装(原创) 1、安装Cgywin软件。可网上查看相关资料。 2、解压hadoop.rar到如:G:\hadoop目录 3、在目录G:\hadoop下新建hadoop-config目录,将conf目录下的四文件(hadoop-env.sh、hadoop-site.xml、masters、slaves)拷贝到该目录下(目的是将这些配置文件与hadoop程序分开,免得程序升级时将这个配置文件覆盖掉了)。 4、配置SSH。在Cgywin中有OpenSSH软件包(加入环境变量PATH= F:\cygwin\bin)。http://server.chinabyte.com/448/2191448.shtml 第一步:把域和本机的组与用户信息导入到Cygwin的帐户和组文件中去。(要加入一个域。若没有域就把自己的机器装个域控制器,方法:找安装盘装上DNS服务,然后在运行中运行Dcpromo,按向导一步步来) 计算机要配置域. 然后在Cgywin中依次执行命令: 1、cd /bin 2、mkgroup -l >> ..\etc\group (注释:local groups)   3、mkgroup -d >> ..\etc\group (domain groups)   4、mkpasswd -l [-u ] >> ..\etc\passwd (local users)   5、mkpasswd -d [-u ] >> ..\etc\passwd (domain users) 6、ssh-keygen  -t  rsa(生成密钥对) 7、接着将生成的id_rsa.pub公钥文件复制到同目录的authorized_keys文件中( cd /cygdrive/c/ Documents\ and\ Settings/Administrator/.ssh cp id_rsa.pub authorized_keys) 8、$chmod 644 authorized_keys(必须保证authorized_keys只对其所有者有读写权限,其他人不允许有写的权限) 第二步:启动OpenSSH服务: net start opensshd (可能找不到服务名,是因为openssh不支持操作系统windows 2003 server)

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档