作爲Nutch中的一個非常重要的數據結構,metadata是一個內容豐富的容器,這裏面存儲了很多值,同時metadata也是一個信息集合的約束,如果要使用metadata,那它裏面的所有聲明的靜態字符串字段,都是約定的一些固定字段,特別是在操作相關信息的時候,metadata的命名是有特殊含義的.
其實從MetaData的類結構中,我們會找到相關的原因.
首先,MetaData實現了六個接口,我們先來分析這五個與類元素密切相關的接口.
|
“創作共用”授權機制的屬性集合
|
|
都柏林核心元數據屬性集合(有關 DublinCore的介紹,請看後續文章)
|
|
HTTP頭文件的屬性集合
|
|
Nutch自定義的內部屬性
|
|
Office文檔屬性的集合
|
以CreativeCommons爲例子:
public interface CreativeCommons{
public final static String LICENSE_URL="Licnese-Url";
public final static String LICENSE_LOCATION="License-Location";
public final static String WORK_TYPE="Work-Type";
}
可以看到,這個接口裏面有三個不能被繼承的,靜態的string類型字段,爲什麼會這樣呢?其實無論是creativeCommons還是其他如DublinCore,HttpHeaders,這些具有都具有特殊意義的集合體標誌,MetaData實現他們,只是附加了一種約束機制,如實現了CreativeCommons,它就符合了”創作共用”的授權,以上代碼中的三個靜態字段,也成爲了MetaData的靜態字段,我們可以使用這三個字段裏面的內容,構造鍵值對加入MetaData類中的HashMap.
從這個意義上來說,是這些接口框定了MetaData中的元素.他們有所分類,並且都具有各自的含義,這樣的好處是讓Metadata具有很好的通用性和擴展性,因爲它實現不同意義的接口.
首先我們先介紹MetaData中的兩個重要的數據結構成員
private final static Map NAMES_IDX = new HashMap();
這裏面存儲的是所有已定義過的MetaData的名字,它因爲屬於類成員,每當類被聲明的時候,它就被類中的靜態塊初始化了,
private Map metadata = null;
這裏面存儲的是最重要的信息,因爲MetaData畢竟是一個存儲某網頁中的不同信息的,我們已經有了描述這些信息的約定好的屬性名,那麼只需要這個Map存儲相應的鍵值對就好了.值得注意的是:
String normalized = getNormalizedName(name);
Object values = metadata.get(normalized);
if (values != null) {
if (values instanceof String) {
List list = new ArrayList();
list.add(values);
list.add(value);這裏使用了List,這樣一個屬性就可以對應多個值了,這樣的好處是多多的,可以保證網頁信息的完整性.
metadata.put(normalized, list);
} else if (values instanceof List) {
((List) values).add(value);
}
} else {
metadata.put(normalized, value);
}
Method Summary
|
void
|
|
|
|
|
getNormalizedName(String name)
根據給定的name,得到標準的name書寫形式,在此類的HashMap中保存了標準的metadata的書寫形式,這個函數通過對給定name進行字母小寫化等的操作,與HashMap中的元素進行匹配,得到標準的書寫形式
|
|
|
void
|
|
void
|
|
int
|
size()
返回metadata中現有屬性的數量
|