nutch支持对诸多的文档类型作了解析处理,包括html,xml,zip,pdf等,其中好像从1.1以后提供了tika的进一步封装处理。
1.说明
在fetch的output()时会发现,它调用了ParseUtil的parse()进行处理。
nutch执行解析时有个优先级原则,即parse-plugins.xml是可选的 ,如果存在,则使用,不存在的话直接从plugin.includes中所有parser plugins根据conent type比较,一样的话就接受。
所有要想使用相关的parser plugins,必须要做到一点:
在plugin.includes中添加相应的plugin id。
另外,要注意的是如果有同类的plugin定义的话,如果执行是顺序的,必须要在相应的xxx.order属性下设置,否则执行顺序是不确定的。我看到nutch-default.xml中说是如果没有在xxxx.order中定义的话,将按plugin.includes中的顺序执行,这是错误的,因为代码中实现是hashmap,然后通过其中的values()直接返回的;如果使用linkedhashmap的话可能没问题。
parse-plugins.xml
这个文件定义了plugin-id的映射关系,即通过content type取哪个Plugin来处理。其中包含二部分:
a)mimeType 这个元素定义了content-type与extension的映射,当然一个content-type可以由多个extensions来按优先级执行(当然了只会执行一个),所以其中有个order属性,但是可选的。
b)alias 这里才是根据上述定义的plugin-id对应到真正的extension-id映射。
综上所述,其中这里定义的plugin-id只是一个中间命名一样,最終比较的却是content type和extension id。
所以要想mimeType中的plugin有效,必须要在alias添加对应的映射。
2.下面从流程开始说起。
1)如果有parse-plugins.xml定义映射关系,否则进入2)
1.1)根据定义的conent-type与plugin.includes中的相应parser插件进行content type和extension id的对比,如果全匹配就添加到返回列表;否则只是简单地进行extension id的比较,此时表明相应的plugin.xml没有指定parameter来支持contentType或不匹配。
2)根据plugin.includes中的parser plugins进行content type对比。
3)如果经过1,2处理后仍然没有找到合适的parser list,则从parse-plugin.xml中取出 contentType为*的plugin ids,重复1)。
4)根据parser list按优先级对content type的content进行最終的parse操作。