Nutch中metadata的分析

 

作爲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
add(String name, String value)   添加一個鍵值對,      
get(String name)        得到給定meta名字的值.
static String
getNormalizedName(String name) 根據給定的name,得到標準的name書寫形式,在此類的HashMap中保存了標準的metadata的書寫形式,這個函數通過對給定name進行字母小寫化等的操作,與HashMap中的元素進行匹配,得到標準的書寫形式
 String[]
getValues(String name)  根據某屬性名,得到它的值
 void
remove(String name)          刪除某屬性,整個鍵值對都會被刪除
 void
set(String name, String value)          設置某鍵值對
 int
size()   返回metadata中現有屬性的數量
 
發佈了5 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章