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;

尝试了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();
    }

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

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

小结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/460093.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Microsoft Remote Desktop Mac

Microsoft Remote Desktop是一款功能强大的远程连接工具,允许用户从远程位置连接到另一台计算机,实现跨设备的无缝协作。无论是在不同的设备之间共享文件、应用程序和其他资源,还是远程访问工作站和服务器,Microsoft Remote Deskt…

Unity开发一个FPS游戏之二

在之前的文章中,我介绍了如何开发一个FPS游戏,添加一个第一人称的主角,并设置武器。现在我将继续完善这个游戏,打算添加敌人,实现其智能寻找玩家并进行对抗。完成的效果如下: fps_enemy_demo 下载资源 首先是设计敌人,我们可以在网上找到一些好的免费素材,例如在Unity…

人机交互三原则,网络7层和对应的设备、公钥私钥

人机交互三原则 heo Mandel提出了人机交互的三个黄金原则,它们强调了相似的设计目标,分别是: 简单总结为:控负持面–>空腹吃面 1,用户控制 2,减轻负担 3,保持界面一致 置用户于控制之下&a…

DHCP在企业网的部署及安全防范

学习目标: 1. DHCP能够解决什么问题? 2. DHCP服务器如何部署? 3. 私接设备会带来什么问题以及如何防范? 给DHCP服务器配置地址: 地址池: DHCP有2种分配模式:全局分配和接口分配 DHCP enable

Upload-labs靶场

文件漏洞上传进行复现 环境搭建--->搭建好环境如下: 打开第一关,尝试文件上传漏洞 根据界面提示,选择一个文件(.php文件)进行上传,发现无法上传 根据提示是指使用js对不合法文件进行了检查,…

传输层的UDP协议

1. UDP协议报文格式 1.1 16位端口号 UDP协议报文中,端口号占2个字节,包括 源端口号 和 目的端口号。 1.2 16位UDP长度 UDP报文长度为2个字节 ,即UDP数据报长度为0~65535,也就是64kb。 1.3 16位UDP检验和 数据在网络传输的…

Python图像处理指南:PIL与OpenCV的比较【第135篇—PIL】

Python图像处理指南:PIL与OpenCV的比较 图像处理在计算机视觉和图像识别等领域中扮演着至关重要的角色。Python作为一种功能强大且易于学习的编程语言,提供了多种库供图像处理使用。在本文中,我们将比较两个最流行的Python图像处理库&#x…

基于正点原子潘多拉STM32L496开发板的简易示波器

一、前言 由于需要对ADC采样性能的评估,重点在于对原波形的拟合性能。 考虑到数据的直观性,本来计划采集后使用串口导出,并用图形做数据拟合,但是这样做的效率低下,不符合实时观察的需要,于是将开发板的屏幕…

云计算2主从数据库

设置主从数据库的目的是将数据库1和数据库2分别建在两个虚拟机上,并实现数据互通访问 首先准备两个虚拟机,这里示例ip分别为: 192.168.200.10;192.168.200.20 修改主机名,一个是mysql1,一个是mysql2&#x…

【每日一问】手机如何开启USB调试?

一、背景 当电脑跟手机之间需要进行交互的时候,可以考虑使用usb进行连接。那么手机如何开启USB调试呢? 二、操作步骤: 思路: 步骤1:手机开启开发者模式 步骤2:在开发者模式中,开启“USB调试”…

【AAAI 2024】解锁深度表格学习(Deep Tabular Learning)的关键:算术特征交互

近日,阿里云人工智能平台PAI与浙江大学吴健、应豪超老师团队合作论文《Arithmetic Feature Interaction is Necessary for Deep Tabular Learning》正式在国际人工智能顶会AAAI-2024上发表。本项工作聚焦于深度表格学习中的一个核心问题:在处理结构化表格…

html5的css使用display: flex进行div居中的坑!

最近做项目的时候,有个需求,一个高度宽度不确定的Div在另一个Div内上下左右居中。 然后以前上下居中用的都是很繁琐的,就打算去百度搜索一个更优秀的方法。 百度AI自己给我一个例子: /* div在容器里居中显示,设置外容…

单片机学到什么程度才可以去工作?

单片机学到什么程度才可以去工作? 如果没有名校或学位的加持,你还得再努力一把,才能从激烈的竞争中胜出。以下这些技能可以给你加分,你看情况学,不同行业对这些组件会有取舍: . Cortex-M内核:理解MCU内核各部件的工作机制&#…

windows的maven 低版本如何切换到高版本

要升级到 Maven 3.9.x 版本,可以按照以下步骤操作: 下载 Maven 3.9.x: 访问 Maven 的官方网站(https://maven.apache.org/download.cgi)并下载 Maven 3.9.x 版本的压缩包。选择与你的操作系统兼容的版本。 2. 解压缩 Maven 3.9.x…

一、MySQL基础学习

目录 1、MySQL启动2、MySQL客户端连接3、SQL3.1、SQL语句分类3.2、DDL(数据库定义语言)3.2.1、操作数据库3.2.2、操作数据表 3.3、DML(数据库操作语言)3.3.1、增加 insert into3.3.2、删除 delete3.3.3、修改 update 3.4、DQL&…

移动云COCA架构实现算力跃升,探索人工智能新未来

近期,随着OpenAI正式发布首款文生视频模型Sora,标志着人工智能大模型在视频生成领域有了重大飞跃。Sora模型不仅能够生成逼真的视频内容,还能够模拟物理世界中的物体运动与交互,其核心在于其能够处理和生成具有复杂动态与空间关系…

逆序对的数量 刷题笔记

思路 使用归并排序 在每次返回时 更新增加答案数 因为归并排序的两个特点 第一 使用双指针算法 第二 层层返回 从局部有序合并到整体有序 例如 {4 ,1 ,2 ,3} 划分到底层是四个数组 {4},{1},{3}, {…

【算法杂货铺】二分算法

目录 🌈前言🌈 📁 朴素二分查找 📂 朴素二分模板 📁 查找区间端点处 细节(重要) 📂 区间左端点处模板 📂 区间右端点处模板 📁 习题 1. 35. 搜索插入位…

『 Linux 』进程替换( Process replacement ) 及 简单Shell的实现(万字)

文章目录 🦄 进程替换🦩 execl()函数🦩 execlp()函数🦩 execle()函数🦩 execv()函数🦩 execvp()函数🦩 execvpe()函数🦩 execve()函数 🦄 简单Shell命令行解释器的实现&a…

Centos8安装Docker,使用阿里云源

一、前期准备 1.关闭防火墙,SELINUX systemctl stop firewalld.service systemctl disable firewalld.service setenforce 0 sed -i "s/SELINUXenforcing/SELINUXdisabled/g" /etc/selinux/config查看状态 systemctl status firewalld systemctl status…