代码改变世界

Nutch中metadata的分析

2006-10-20 00:30  cppguy  阅读(859)  评论(0编辑  收藏  举报

 

作为Nutch中的一个非常重要的数据结构,metadata是一个内容丰富的容器,这里面存储了很多值,同时metadata也是一个信息集合的约束,如果要使用metadata,那它里面的所有声明的静态字符串字段,都是约定的一些固定字段,特别是在操作相关信息的时候,metadata的命名是有特殊含义的.

其实从MetaData的类结构中,我们会找到相关的原因.

首先,MetaData实现了六个接口,我们先来分析这五个与类元素密切相关的接口.

CreativeCommons

“创作共用”授权机制的属性集合

DublinCore

都柏林核心元数据属性集合(有关 DublinCore的介绍,请看后续文章)

HttpHeaders

HTTP头文件的属性集合

Nutch

Nutch自定义的内部属性

Office

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)
  
添加一个键值对,      

 String

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中现有属性的数量