为什么使用ForkParser时未填充我的Tika Metadata对象?

时间:2011-12-01 23:35:06

标签: java memory-management metadata content-type apache-tika

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

为什么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;
    }
}

1 个答案:

答案 0 :(得分:3)

遗憾的是,Tika 1.0中的ForkParser类不支持元数据提取,因为现在到分叉解析器进程的通信通道仅支持传回SAX事件而不支持元数据条目。我建议您提交TIKA改进问题以解决此问题。

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