StormCrawler集成Apache Tika后PDF属性解析失败求助
排查StormCrawler中PDF解析与索引问题的方向和修复建议
针对你遇到的PDF文档无法解析元数据(Title、Authors)且content字段为空的问题,结合你的配置文件,我整理了以下排查和修复步骤:
1. 修正PDF处理链路,避免HTML解析器干扰
从你的es-crawler.flux配置来看,所有抓取到的内容(包括PDF)都会先经过JSoupParserBolt——这是核心问题所在:JSoup是专门处理HTML的解析器,它无法识别PDF二进制内容,会把PDF数据当作无效HTML处理,导致后续Tika ParserBolt无法获取到原始的PDF字节流,自然解析不出内容和元数据。
修复建议:
调整数据流链路,让PDF直接走Tika ParserBolt,HTML走JSoupParserBolt:
- 在
crawler-conf.yaml中为两个解析器指定处理的内容类型:# JSoup只处理HTML类型 jsoup.parser.bolt.content.types: text/html,application/xhtml+xml # Tika处理PDF及其他办公文档类型 tika.parser.bolt.content.types: application/pdf,application/vnd.openxmlformats-officedocument.wordprocessingml.document - 修改
es-crawler.flux的streams配置,让sitemap的输出根据内容类型分流:
首先添加一个FilterBolt来做路由,或者直接通过字段分组转发:
这样就能确保PDF内容不会经过JSoup处理,直接交给Tika解析。bolts: # 新增FilterBolt用于分流 - id: "content_type_filter" className: "com.digitalpebble.stormcrawler.bolt.FilterBolt" parallelism: 1 configMethods: - name: "addFilter" args: ["contentType", "matches", "text/html|application/xhtml+xml", "toJSoup"] - name: "addFilter" args: ["contentType", "matches", "application/pdf", "toTika"] streams: # 原sitemap输出到filter - from: "sitemap" to: "content_type_filter" grouping: type: LOCAL_OR_SHUFFLE # HTML内容到JSoupParserBolt - from: "content_type_filter" to: "parse" grouping: type: LOCAL_OR_SHUFFLE streamId: "toJSoup" # PDF内容到Tika的RedirectionBolt和ParserBolt - from: "content_type_filter" to: "redirection_bolt" grouping: type: LOCAL_OR_SHUFFLE streamId: "toTika"
2. 验证Tika ParserBolt的配置与依赖完整性
- 检查依赖:你的
pom.xml片段不完整,需要确保引入了完整的Tika依赖,否则可能无法解析PDF:<dependencies> <!-- StormCrawler Tika集成 --> <dependency> <groupId>com.digitalpebble.stormcrawler</groupId> <artifactId>storm-crawler-tika</artifactId> <version>你的StormCrawler版本</version> </dependency> <!-- Tika核心及标准解析包 --> <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>2.x</version> </dependency> <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-parsers-standard-package</artifactId> <version>2.x</version> <type>pom</type> </dependency> </dependencies> - 确认Tika解析字段映射:在
crawler-conf.yaml中配置Tika解析后要保留的元数据字段:
这样Tika解析出的Title、Authors会被存入文档的元数据中,后续IndexerBolt就能读取这些字段。tika.parser.bolt.md.mapping: # 映射Tika解析出的元数据到StormCrawler的元数据字段 dc:title: title dc:creator: authors # 其他需要的元数据字段...
3. 确保ES索引映射与Indexer配置正确
- 检查索引映射:你的
index.md.mapping需要明确包含title、authors、content字段的定义,示例:{ "mappings": { "properties": { "title": {"type": "text", "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}}, "authors": {"type": "keyword"}, "content": {"type": "text"}, "url": {"type": "keyword"}, # 其他字段... } } } - 配置IndexerBolt读取字段:在
crawler-conf.yaml中指定Indexer要索引的元数据字段:
确保这些字段被包含在索引列表中,否则ES中不会出现对应的字段。indexer.md.fields: title,authors,content,url,contentType
4. 查看日志定位具体错误
开启StormCrawler的DEBUG日志,重点关注以下组件的日志:
FetcherBolt:确认PDF的content-type是否为application/pdf,以及是否成功获取了完整的内容(查看content-length)。ParserBolt(Tika):查看是否有解析PDF时的异常日志,比如IOException或元数据缺失的提示。IndexerBolt:确认是否读取到了title、authors、content字段,以及是否正确发送到ES。
5. 清理无效配置
你的es-injector.flux中添加了parser_bolt,这是不必要的——Injector的作用只是将种子URL存入ES,不需要解析内容,建议移除这个bolt,避免资源浪费。
内容的提问来源于stack exchange,提问作者heythere
相关产品推荐
相关产品推荐

