4

ForkParser是在 Tika 0.9 版中引入的新 Tika 解析器,位于org.apache.tika.fork. 新的解析器派生出一个新的 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;
    }
}
4

1 回答 1

3

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

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

于 2011-12-02T09:44:17.543 回答