Nutch中metadata的分析
2006-10-20 00:30 cppguy 阅读(859) 评论(0) 编辑 收藏 举报
作为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);
}
void |
|
static String |
getNormalizedName(String name) |
String[] |
|
void |
|
void |
|
int |
size() |