• 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解析类
    import org.apache.tika.parser.microsoft.OfficeParser;
    
    • 1

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

    在引用最新的2.9.0版本运行时报错:
    在这里插入图片描述

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

    排除路径字符问题

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

    使用最新的Tika库

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

        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();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

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

    小结

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

  • 相关阅读:
    读书充电,温暖你的冬日,本期为大家送出几本架构师成长和软件架构技术相关的好书,助你度过这个不太景气的寒冬!
    python实现Flask POST Demo
    mybatis if标签或者when标签判断字符串是否相等
    数据在内存中的存储
    SpringCloud微服务 【实用篇】| Eureka注册中心、Ribbon负载均衡
    jenkins+git持续集成配置
    【毕设教学】 经典单片机控制算法:PID - 嵌入式 物联网
    UVM m_sequencer 和 p_sequencer
    如何应对Redis并发访问带来的问题
    element-UI 列表渲染图片,后台回传Base64
  • 原文地址:https://blog.csdn.net/yuand7/article/details/136723613