ES解析word内容为空的问题和直接使用Tika解析文档的方案

导言

在上一篇文章最后,我们虽然跑通了ES文件搜索的全部流程,但是仍然出现了1个大的问题:ES7.3实测无法索引docx和doc文档,content有值但是无法解析到附件成为可读的可搜索的内容,附件内容为空(附件中根本没有content这个字段,并非内容为空)。解决的思路是可以直接使用tika解析它的内容直接传递给ES,而不用通过pipline的黑盒。

系列文章传送门:

1. 实现ES检索pdf等文件内容的插件

2. 基于GitBucket的Hook构建ES检索PDF等文档全栈方案

3. Java实现读取转码写入ES

4. ES文件搜索的细节优化与实现

排查过程

base64码是否存在?

答案是存在的!

首先是在Java应用程序添加打印入ES库前转码的base64对象的内容长度,均为十几万字符数,看不出与pdf文件有什么本质的区别。

排除转码问题!

数据流传输失败?

其次,我修改了pipline,取消自动删除content的源字段,结果content中具有正常的大段base64内容但无法阅读,ES的attachment中还是没有解析后的内容!

注意,入库是成功的,ES有这一次提交的结果,比如作者、文件名、标签等其他信息,只是看不了文件正文内容!

word文档存在问题?

那么有可能是我的word文档有问题吗?

于是我新建了一个测试文件,类型为docx,同时增加了一个测试文件类型为docx,结果表明docx文件还是无法正常解析!

doc文件则直接在运行时报错找不到某个临时文件。

ES在处理时报错?

在复测docx类型文件入库时,我也检查了Java应用程序的日志,ES的master服务以及data节点的日志,全都没有任何相关的错误与警告。

Excel解析有问题吗?

实际上,我加测了xlsx的表格文件,也是无法解析内容的,一部分word文件被解析为zip压缩文件,还有一部分被解析为xml文件格式,说明即便都是docx类型文件,ES的管道附件的识别也不一样,这与用户的直观感受不相符!

至此,这个问题陷入了泥潭!

在查询问题的过程中,GPT总是提示我该pipline已经被废弃,不推荐使用。

最终方案

既然官方指出该插件基于tika库实现,我们何不直接使用tika解析word等文件呢?这虽然失去了分布式的效果,但是一来更加可靠和可控,二来针对pdf类文件的业务场景体量都很小,犯不上使用分布式架构。

tika测试找不到office解析类
java 复制代码
import org.apache.tika.parser.microsoft.OfficeParser;

尝试了tika库1.7/1.27和1.28版本均找不到该类!

在引用最新的2.9.0版本运行时报错:

从报错看,这个方法与文件版本有依赖关系,适应性太差!

排除路径字符问题

尝试了修改文件名为全英文,路径也不包含中文字符或空格,但是都不打印内容!

使用最新的Tika库

最后查阅Tika官网的示例,修改成功的代码如下:

java 复制代码
    public static String getConteByTika(String filePath) throws IOException, TikaException, SAXException {
        // 创建一个输入流
        InputStream inputStream = Files.newInputStream(new File(filePath).toPath());

        AutoDetectParser parser = new AutoDetectParser();
        BodyContentHandler handler = new BodyContentHandler(-1);
        Metadata metadata = new Metadata();

        // 解析文件以提取元数据和内容
        parser.parse(inputStream, handler, metadata);
        inputStream.close();
        return handler.toString();
    }

这个方法的返回值当做es的一个普通文本字段内容即可,ES侧不需要额外配置任何插件pipline。

经过验证已经可以解析pdf、docx/excel/ppt和markdown、txt等6种格式的文件内容,实际上可支持的类型要远超这六种。

小结

综上,我们完全可以基于Tika库来设计可控的文档解析,并写入ES,弃用ES的插件。在这种方案里我们可以拥有更高的自由度,并随时可以进行任何的调试,不再是pipline的黑盒方案。

相关推荐
Hello.Reader3 小时前
用 Table ID 驯服异构库Flink CDC 跨系统表映射的工程化实践
大数据·flink
黄雪超3 小时前
Paimon——官网阅读:理解文件
大数据·数据湖·paimon
武子康4 小时前
大数据-149 Apache Druid 实时 OLAP 架构与选型要点
大数据·后端·nosql
tang_jian_dong4 小时前
win10 配置下载安装 Office LTSC 专业增强版 2024
word·excel
失散134 小时前
分布式专题——49 SpringBoot整合ElasticSearch8.x实战
java·spring boot·分布式·elasticsearch·架构
snakecy4 小时前
系统时间更新
大数据·学习·docker·区块链
陈辛chenxin5 小时前
【大数据技术01】数据科学的基础理论
大数据·人工智能·python·深度学习·机器学习·数据挖掘·数据分析
失散135 小时前
分布式专题——48 ElasticSearch聚合操作详解
分布式·elasticsearch
weisian1515 小时前
Elasticsearch-3--什么是Lucene?
大数据·elasticsearch·lucene
汤姆yu13 小时前
基于大数据的信贷风险评估的数据可视化分析与预测系统
大数据·信息可视化