为什么我的Tika元数据对象在使用ForkParser时未被填充?

问题描述:

ForkParser是一个新的Tika语法分析器,在Tika 0.9版中引入,位于org.apache.tika.fork。新的解析器派生出一个新的jvm进程来分析传递的文件流。我想这可能是一个很好的方法来限制我愿意投入Tika的元数据提取过程的内存量。但是,Metadata对象没有像使用AutoDetectParser时那样使用适当的元数据属性填充。测试显示BodyContentHandler对象不是null为什么我的Tika元数据对象在使用ForkParser时未被填充?

为什么Metadata对象没有被填充任何东西(手动添加的RESOURCE_NAME_KEY除外)?

public static Metadata getMetadata(File f) { 
    Metadata metadata = new Metadata(); 
    try { 
     FileInputStream fis = new FileInputStream(f); 
     BodyContentHandler contentHandler = new BodyContentHandler(-1); 
     ParseContext context = new ParseContext(); 
     ForkParser parser = new ForkParser(); 

     parser.setJavaCommand("/usr/local/java6/bin/java -Xmx64m"); 
     metadata.set(Metadata.RESOURCE_NAME_KEY, f.getName()); 

     parser.parse(fis, contentHandler, metadata, context); 
     fis.close(); 

     String contentType = metadata.get(Metadata.CONTENT_TYPE); 

     logger.error("contentHandler: " + contentHandler.toString()); 
     logger.error("metadata: " + metadata.toString()); 

     return metadata; 

    } catch (Throwable e) { 
     logger.error("Exception while analyzing file\n" + 
     "CAUTION: metadata may still have useful content in it!\n" + 
     "Exception: " + e, e); 

     return metadata; 
    } 
} 

ForkParser类提卡1.0可惜不支持,因为现在元数据提取所述通信信道向两岔解析器过程仅支持回传SAX事件而不是元数据条目。我建议你提交一个TIKA改进问题来解决这个问题。

您可能需要考虑的一种解决方法是从叉形分析器返回的XHTML文档的<head>部分的<meta>标签中获取提取的元数据。这些应该可用并且包含大多数通常在Metadata对象中返回的元数据条目。

+0

谢谢Jukka,我提起了你提到的Tika改进问题。我将研究解析由解析方法产生的XHTML文档,但我仍然需要弄清楚如何做到这一点。 XHTML文档从哪里返回?我看到的是,解析方法是一个无效方法,并不会返回任何内容。它是在内容处理程序中还是在传递给解析方法的其他对象之一中? – anchovie