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

Nutch/Lucene的存取机制与结构分析(收藏)

需注明出处,未经作者同意,不得用于任何形式的商业活动主题:解决nutch的segmens的拆分与nutchcrawl的重载(重新构建)问题主要内容一、Lucene的索引机制与索引文件结构二、Nutc

需注明出处,未经作者同意,不得用于任何形式的商业活动

主题:解决nutch的segmens的拆分与nutch crawl的重载(重新构建)问题


主要内容

一、Lucene的索引机制与索引文件结构
二、Nutch的爬虫分析与文件结构分析
三、Nutch segments的拆分索引实现方案


一、Lucene的索引机制与索引文件结构
1、Lucene的索引机制
2、Lucene文件格式
_0.f0,_0.f1 文档文件
_0.fnm域集合信息文件 
0.frq; 0.prx位置与频率文件 
*.fdt和*.fdx构成了域值/域索引文件
segment1.nrm标准化因子 
- segments索引块文件 
- deletable保存已删除文件的记录 
-*.tii和*.tis构成了项字典 
-lock(无扩展名) 用来控制读写的同步 


二、Nutch的爬虫分析
Nutch segments分析
Nutch 的文件结构分析


三、Nutch segments的拆分解决方案

Lucene采取的是倒排索引结构存储结构建立反向索引。对爬取回来的信息通过Lucene Analyzer分词器提取出索引项以相关信息,如索引项的出现频率。然后分词器把这些信息写到索引文件中。其核心在于Lucene的索引文件结构(倒排索引结构),首先理解”反向索引”的概念。

反向索引是一种以索引项为中心来组织文档的方式,每个索引项指向一个文档序列,这个序列中的文档都包含该索引项。相反,在正向索引中,文档占据了中心的位置,每个文档指向了一个它所包含的索引项的序列。你可以利用反向索引轻松的找到那些文档包含了特定的索引项。 Lucene使用了反向索引作为其基本的索引结构。

Lucene索引index由若干段(segment)组成,每一段由若干的文档(document)组成,每一个文档由若干的域(field)组成,每一个域由若干的项(term)组成。项是最小的索引概念单位,它直接代表了一个字符串以及其在文件中的位置、出现次数等信息。域是一个关联的元组,由一个域名和一个域值组成,域名是一个字串,域值是一个项,比如将“标题”和实际标题的项组成的域。

文档是提取了某个文件中的所有信息之后的结果,这些组成了段,或者称为一个子索引。子索引可以组合为索引,也可以合并为一个新的包含了所有合并项内部元素的子索引。

Lucene采用倒排索引结构索引被处理为一个目录(文件夹),其中含有的所有文件即为其内容,这些文件按照所属的段不同分组存放,同组的文件拥有相同的文件名,不同的扩展名。此外还有三个文件,分别用来保存所有的段的记录、保存已删除文件的记录和控制读写的同步,它们分别是segments, deletable和lock文件,都没有扩展名。

每个段包含一组文件,它们的文件扩展名不同,但是文件名均为记录在文件segments中段的名字每个 段的文件中。
主要记录了两大类的信息:域集合与项集合。由于索引信息是静态存储的,域集合与项集合中的文件组采用了一种类似的存储办法:一个小型的索引文件,运行时载 入内存;一个对应于索引文件的实际信息文件,可以按照索引中指示的偏移量随机访问;索引文件与信息文件在记录的排列顺序上存在隐式的对应关系,即索引文件中按照“索引项

1、索引项2…”排列,则信息文件则也按照“信息项1、信息项2…”排列。域集合与项集合之间则通过域的在域记录文件(比如segment1.fnm)中所记录的域记录号维持对应关系,segment1.fdx与segment1.tii中就是通过这种方式保持联系。这样,域集合和项集合不仅仅联系起来,而且其中的文件之间也相互联系起来。这样,整个段的索引信息

就通过这些文档有机的组成。
Lucene所采用的索引文件格式。基本上而言,它是一个倒排索引。,但是Lucene在文件的安排上做了一些努力,比如使用索引/信息文件的方式,从文件安排的形式上提高查找的效率。

(_0.f0,_0.f1 文档文件)
文档号(Document Number)
编号方式:Lucene用一个整形(interger)的文档号来指示文档。第一个被加入到索引的文档就是0号,顺序加入的文档将得到一个由前一个号码递增而来的号码。 
标准的技术是根据每一段号码多少为每一段分配一个段号。将段内文档号转换到段外时,加上段号。将某段外的文档号转换到段内时,根据每段中可能的转换后号码范围来判断文档属于那一段,并减调这一段的段号。例如有两个含5个文档的段合并,那么第一段的段号就是0,第二段段号5。第二段中的第三个文档,在段外的号码就是8。 
(_0.fnm域集合信息)
索引中的文档由一个或者多个域组成,这个文件包含了每个索引块中的域的信息。
所有域名都存储在这个文件的域集合信息中文件中的域根据它们的次序编号。因此域0是文件中的第一个域,域1是接下来的 ,这个和文档号的编号方式相同。

项频数 .frq文件包含每一项的文档的列表,还有该项在对应文档中出现的频数。 
项位置 .prx文件包含了某文档中某项出现的位置信息的列表。

(0.frq; 0.prx位置与频率文件)
项频数 .frq文件包含每一项的文档的列表,还有该项在对应文档中出现的频数。 
项位置 .prx文件包含了某文档中某项出现的位置信息的列表。

(*.fdt和*.fdx构成了域值/域索引文件)
域值存储表(Stored Fields)域值存储表使用域索引 .fdx与域值 .fdt两个文件表示。

(segment1.nrm标准化因子)
.nrm文件包含了每个文档的标准化因子,其主要用在评分排序机制中。

(segments索引块文件)
Segments索引块又称segment段,这个文件包含了索引中的索引块信息,这个文件包含了每个索引块的名字以及大小等信息。

(deletable保存已删除文件的记录)
deletetable的文件包含了索引不再使用的文件的名字,这些文件可能并没有被实际的删除。
.del文件是可选的,只有在某段中存在删除操作后才存在。

(*.tii和*.tis构成了项字典 )
项字典用项信息(.tis文件)和项信息索引(.tii文件) 两个文件表示。
项信息索引(.tii文件)
每个项信息索引文件包含.tis文件中的128个条目,依照条目在.tis文件中的顺序。这样设计是为了一次将索引信息读入内存能,然后使用它来随机的访问.tis文件。这个文件的结构和.tis文件非常类似,只在每个条目记录上增加了一个变量IndexDelta。

(lock(无扩展名) 用来控制读写的同步)
主要是用于防止进程在使用索引时,被其它文件操作修改索引。

Nutch的爬虫分析

1. 创建一个新的WebDb (admin db -create);
2. 将抓取起始URLs写入WebDB中 (inject); 
3. 根据WebDB生成fetchlist并写入相应的segment(generate); 
4. 根据fetchlist中的URL抓取网页 (fetch).;
5. 根据抓取网页更新WebDb (updatedb).
通过3—5这个循环就可以实现Nutch的深度抓取。

Nutch segments分析
对于segments/segment/下的文件以后分析)结构,在nutch爬虫运行后在webdb文件夹下一共产生如下五个文件: 
linksByMD5 linksByURL pagesByMD5 pagesByURL stats
其中:
Stats文件用来存放爬虫爬行后的版本信息,处理网页数量,连接数量;
pagesByURL等其余四个文件夹下均有两个文件――index和data,其中data文件用来存放有序的key/value对,排序是通过选择不同的key和comparator来改变的,当然里面会有一些其他信息, 比如在pagesByURL中,就每隔一定长度的key/value对放入一个用来定位的信息(syn);index文件用来存放索引,但是这个索引文件也是一个有序的,这个里面存放的是key和位置信息,但是在data文件中出现的key在这个index中都能找到的,它为了节省空间,实施了每隔一段key/value建立一条索引,这样在查找的时候,因为是有序的,所以采用2分查找,如果找不到,则返回最后时候的最小的位置信息,这个位置离我们要找的目标是相当近的,然后在data文件的这个位置向前找就可以很快找到了!
另外,nutch维持这个webdb的方式是,在填加,删除网页或者连接时,并不是直接向这个webdb中填加网页或者连接,而是在WebDBWriter 中的内部类PageInstructionWriter或者LinkInstructionWriter中填加一条对网页操作的命令,然后最后对存放的命令进行排序去重,最后将这个命令与现有的webdb中存放的网页数据进行合并;

Fetcher类是进行实际网页抓取时候运行的类,爬虫产生的文件或文件夹都是由这个类产生的, Nutch提供了选项―是否对抓回的网页进行parse(解析),如果这个选项设置为false,将没有parseddata和parsedtext这两个文件夹。
nutch爬虫产生的文件几乎都是key/value对,不同的只是key/value的种类和值不同,爬虫运行后在segments文件夹的子文件夹产生
如下几个文件夹: content fetcher fetchlist index parse_data parse_text

其中content文件夹存放的内容对应protocol包中的content类;fetcher文件夹存放的内容对应的是fetcher包中的FetcherOutput类;fetchlist对应pagedb包总的fetchlist类;parse_data和parse_text分别对应parse包中的ParseData和ParseText类;

(Nutch segments)
如上面Nutch segments分析所述,对Nutch的segments有了清楚的了解。
提示点:Lucene 中的segment和Nutch中的不同,Lucene中的segment是索引index的一部分,但是Nutch中的segment只是WebDB中 各个部分网页的内容和索引,最后通过其生成的index跟这些segment已经毫无关系了。

(Nutch crawldb)
其主要是segments段的crawl_fetch与parse_data的数据。并利用其crawldb循环fetch 生成segments深度抓取。

(Nutch linkdb)
其存放的为segments所有段的crawl_fetch数据,其URL列表。

(Nutch indexes)
由Nutch crawldb,linkdb segments生成indexes索引集。其存放结构是结合Lucene的索引机制存放的。

(Nutch index)
由nutch indexes 单独提取索引信息。其索引结果可利用Luke进行索引结果查询。

Nutch 在tomcat下使用的资源主要是segments,linkdb,indexes。

nutch segments的拆分解决方案
从上面的分析可以得出Nutch的爬虫数据都以segments段存放信息。
我们只需要对segments进行slice拆分,就可以重新构造crawl数据源结构。
然后再利用nutch的相应操作完成对nutch segments的拆分与重构。


推荐阅读
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • 本文详细介绍了 Spark 中的弹性分布式数据集(RDD)及其常见的操作方法,包括 union、intersection、cartesian、subtract、join、cogroup 等转换操作,以及 count、collect、reduce、take、foreach、first、saveAsTextFile 等行动操作。 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • Leetcode学习成长记:天池leetcode基础训练营Task01数组
    前言这是本人第一次参加由Datawhale举办的组队学习活动,这个活动每月一次,之前也一直关注,但未亲身参与过,这次看到活动 ... [详细]
  • iOS 不定参数 详解 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 一、Tomcat安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat8.0\webapps二、Tomcat8.0配置多个端口,其实也就是给T ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • Android 自定义 RecycleView 左滑上下分层示例代码
    为了满足项目需求,需要在多个场景中实现左滑删除功能,并且后续可能在列表项中增加其他功能。虽然网络上有很多左滑删除的示例,但大多数封装不够完善。因此,我们尝试自己封装一个更加灵活和通用的解决方案。 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
author-avatar
mobiledu2502889253
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有