插件介紹:
對于Nutch插件概念的基本介紹請看:http://www.cnblogs.com/abob/archive/2006/09/07/497...
Cretivecommons插件的主要作用是從抓取的網(wǎng)頁(yè)中提取一些特定的或者我們自定義的一些信息(這里的信息必須符合cc機制),為這些信息建立索引,提供查詢(xún)的功能.舉個(gè)例子:比如我們正在爬行某招聘網(wǎng)站的網(wǎng)頁(yè),我們對某一招聘信息的職位描述感興趣,那么我們就可以擴展這一插件,篩取出此網(wǎng)頁(yè)職位描述的信息,建立此網(wǎng)頁(yè)新Field(Lunene的Document),入索引庫.等待查詢(xún)或者進(jìn)行別的操作.
為了達到目標,creativecommons plugin擴展3個(gè)不同的擴展點(diǎn),它們是:
HTMLParser:從meta-tags得到推薦的terms
IndexingFilter:增加一個(gè)推薦Field在索引中。
QueryFilter:增加對索引中新Field的查詢(xún)能力.
插件中一些概念的說(shuō)明:
creative commons:(創(chuàng )作共用) 是網(wǎng)絡(luò )上的數字作品(文學(xué)、美術(shù)、音樂(lè )等)許可授權機制,它致力于讓任何創(chuàng )造性作品都
有機會(huì )被更多人分享和再創(chuàng )造,共同促進(jìn)人類(lèi)知識作品在其生命周期內產(chǎn)生最大價(jià)值。Nutch引入這個(gè)機制是為了在所索引的網(wǎng)頁(yè)
使用創(chuàng )作公用這個(gè)授權機制,對所索引到的內容進(jìn)行知識保護,這不但能對資源提供者的知識進(jìn)行保護,也能促進(jìn)知識資源的良性傳播,
插件的代碼分析:
creativecommons插件包括以下四個(gè)文件:
CCIndexingFilter:實(shí)現了IndexingFilter這個(gè)接口
CCParseFilter:實(shí)現了HTMLParser這個(gè)接口
CCQueryyFilter:實(shí)現了QueryFilter這個(gè)接口
CCDeleteUnlicnese:刪除那些沒(méi)有在Nutch的creativecommons授權機制中定義的元素
一:
CCIndexingFilter代碼分析:
核心方法:
public Document filter(Document doc, Parse parse, UTF8 url, CrawlDatum datum, Inlinks inlinks)
此方法是對基類(lèi)Indexingfiler中的filter的重寫(xiě),它接收了某網(wǎng)頁(yè)已經(jīng)形成的Document,從分析部件對該網(wǎng)頁(yè)的分析結果Parse中抽取所要索引的信息,為其建立新的lucene field,然后加入Documet中.
參數:
Document Lucene中的Document,詳情請見(jiàn):http://www.lucene.com.cn/lucene.htm
Parse:是個(gè)接口,這里代表的是對一個(gè)網(wǎng)頁(yè)原始內容(html流)分析的結果,詳細分析請見(jiàn):http://www.cnblogs.com/abob/archive/2006/10/19/534...
UTF8:以utf-8編碼的url
CrawlDatum:描述了Fetcher在抓取網(wǎng)頁(yè)時(shí)的狀態(tài),詳情請見(jiàn)Fetcher的分析http://www.cnblogs.com/abob/archive/2006/10/19/534...
Inlinks:這里面存儲了inlink的列表,inlink是一個(gè)網(wǎng)頁(yè)中包含的鏈接.詳情請見(jiàn)crawl的分析
方法實(shí)現:
Metadata metadata = parse.getData().getParseMeta();
這句代碼是從分析結果Parse中獲得一個(gè)metadata,這個(gè)metadata對象,包括了是一個(gè)內容豐富的容器,也是一個(gè)分析信息結構的語(yǔ)法.詳情請見(jiàn)http://www.cnblogs.com/abob/archive/2006/10/20/534....,得到的這個(gè)metadata對象里包括了該被分析的頁(yè)面中的所有信息.
以下的代碼是將所要索引的信息,利用CreativeCommons中的字段聲明從metadata對象中提取出來(lái),然后添加到Document中.比如第一個(gè)我們要處理的是Licneseurl,首先通過(guò)代碼
String licenseUrl = metadata.get(CreativeCommons.LICENSE_URL);
提取信息,然后判斷是否為空,寫(xiě)入日志,
if (licenseUrl != null) {
if (LOG.isInfoEnabled()) {
LOG.info("CC: indexing " + licenseUrl + " for: " + url.toString());
}
添加到lucene的Document中.
// add the entire license as cc:license=xxx
addFeature(doc, "license=" + licenseUrl);
// index license attributes extracted of the license url
addUrlFeatures(doc, licenseUrl);
}
以下關(guān)于license location同理可得:
// index the license location as cc:meta=xxx
String licenseLocation = metadata.get(CreativeCommons.LICENSE_LOCATION);
if (licenseLocation != null) {
addFeature(doc, "meta=" + licenseLocation);
}
// index the work type cc:type=xxx
String workType = metadata.get(CreativeCommons.WORK_TYPE);
if (workType != null) {
addFeature(doc, workType);
}
返回已經(jīng)修改好得Document.
return doc;
以上就是對CCIndexingFilter核心代碼得基本分析.
從一我們知道了如何從Parse中篩選出我們想要特別添加的metadata,向lucnene的索引文檔Document中添加新的Field.這
里面牽扯到了CC授權機制,其實(shí)在整個(gè)creativecommons插件中,針對的就是經(jīng)過(guò)creative commons聲明的元素.為什么叫這個(gè)插件的名字,也就是這個(gè)道理了.下面我們要研究的是怎么向Parse添加符合CC授權機制的metadata.
二:
CCParseFilter的代碼分析
內部元素和核心方法:
Walker:靜態(tài)的內部類(lèi),主要作用是通過(guò)遍歷某網(wǎng)頁(yè)的DOM樹(shù),尋找內容中的RDF和節點(diǎn)中Licenses.
WORK_TYPE_NAMES:針對worktype的哈希表.
filter方法:實(shí)現了HTMLParseFilter的方法.下面有介紹.這里主要調用了Walker.walk.
首先我們了解一個(gè)接口 HtmlParseFilter,請見(jiàn)package org.apache.nutch.parse,在以后的代碼分析中也會(huì )對它有所介紹.
這個(gè)接口是對以DOM樹(shù)為基礎的HTML文檔的分析器的擴展點(diǎn),它允許你向這個(gè)HTMLParsers添加metadata.而這里為添加符合CC授權機制的metadata.
public interface HtmlParseFilter extends Pluggable, Configurable {
/** 擴展點(diǎn)的名字 */
final static String X_POINT_ID = HtmlParseFilter.class.getName();
/** 根據一個(gè)網(wǎng)頁(yè)的DOM樹(shù),通過(guò)此函數對其HTML流的分析結果添加metadata,或者進(jìn)行修改 */
Parse filter(Content content, Parse parse, HTMLMetaTags metaTags, DocumentFragment doc);
}
下面我們看類(lèi)內部的元素:
對于Walker這個(gè)靜態(tài)的內部類(lèi),是整個(gè)模塊代碼的核心,如果我們要完成向其添加新metadata的任務(wù),也是要擴展這個(gè)類(lèi),這個(gè)插件要擴展的三個(gè)metadata是:CreativeCommons.LICENSE_URL CreativeCommons_LOCATION CreativeCommons_WORKTYPE. Walker的核心方法private void walk(Node node) ,完成了對DOM樹(shù)的遍歷,并找到相關(guān)的元素;
下面我們看Filter這個(gè)核心方法
public Parse filter(Content content, Parse parse, HTMLMetaTags metaTags, DocumentFragment doc)
參數:
Content:此類(lèi)是Nutch一個(gè)重要的數據結構,從通過(guò)Socket得到某網(wǎng)頁(yè)的html包,加工成content,再到整個(gè)分析,索引的過(guò)程都與這個(gè)數據結構的操作有密切關(guān)系,在分析Protocol的時(shí)候還會(huì )對這個(gè)類(lèi)做詳細論述,這里大家要理解這也是個(gè)類(lèi)似與MetaData一樣,是一個(gè)內容豐富的容器.
Content的主要字段:
private byte version;
private String url;
private String base;
private byte[] content;
private String contentType;
private Metadata metadata;
private boolean mimeTypeMagic;
private MimeTypes mimeTypes;
Parse:是個(gè)接口,這里代表的是對一個(gè)網(wǎng)頁(yè)原始內容(html流)分析的結果,詳細分析請見(jiàn):http://www.cnblogs.com/abob/archive/2006/10/19/534...
HTMLMetaTags:這個(gè)類(lèi)存儲了一些從該被分析的網(wǎng)頁(yè)中提取的HTML meta信息,為了易于訪(fǎng)問(wèn),這個(gè)類(lèi)里面定義了一些類(lèi)似與屬性操作德函數.
DocumentFragment: 是“輕量級”或“最小”Document 對象。希望能夠提取文檔樹(shù)的一部分或創(chuàng )建文檔的新片段是很常見(jiàn)的。設想實(shí)現像剪切這樣的用戶(hù)命令或通過(guò)來(lái)回移動(dòng)片段重新安排文檔。需要有一個(gè)可以保存此類(lèi)片段的對象,很自然出于此目要使用一個(gè) Node。當 Document 對象真正可以完成此職責時(shí),Document 對象可能為重量級對象,具體取決于基礎實(shí)現。此操作真正需要的是非常輕量級的對象。DocumentFragment 就是這樣的對象。
以上是對cc插件的基本介紹,關(guān)于后兩個(gè)CCQueryyFilter: CCDeleteUnlicnese:文件,我們不再敘述,因為有以上的知識,理解就很容易了.
聯(lián)系客服