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

news2025/1/11 14:23:39

导言

在上一篇文章最后,我们虽然跑通了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的黑盒方案。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【pycharm】如何将pacharm设置成中文

【pycharm】汉化教程——如何将pacharm设置成中文 1、打开pycharm 2、点击file 3、点击setting——Plugins——搜索Chinese——点击如下图图标进行下载 汉化后界面情况:

JVM高频面试点(一):Java类加载过程

1.概述 在 Java 中,类加载过程是指将 Java 类的字节码加载到内存中,并转换为 Java 虚拟机能够识别和执行的数据结构的过程。类加载是 Java 虚拟机执行 Java 程序的必要步骤之一,它负责加载程序中用到的类和接口。下图所示是 ClassLoader 加载…

【滤波专题-第9篇】类EMD分解算法联合小波阈值降噪及MATLAB代码实现(以ICEEMDAN-样本熵-小波阈值降噪方法为例)

今天这篇介绍的算法,由于其高度的灵活性、使用方法的丰富性以及不错的效果,堪称水论文神器。对于需要使用滤波算法的同学们,这篇文章不可错过~ 本篇会提及很多前置概念,比如ICEEMDAN等模态分解算法、熵特征提取、小波阈值滤波等等…

idea项目mapper.xml中的SQL语句黄色下划线去除

问题描述 当我们使用idea开发java项目时,经常会与数据库打交道,一般在使用mybatis的时候需要写一大堆的mapper.xml以及SQL语句,每当写完SQL语句的时候总是有黄色下划线,看着很不舒服。 解决方案: 修改idea的配置 Edi…

SQLiteC/C++接口详细介绍之sqlite3类(八)

返回目录:SQLite—免费开源数据库系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(七) 下一篇: SQLiteC/C接口详细介绍之sqlite3类(八)(暂未发表) 24.sqlite3_cr…

SpringMVC重点记录

目录 1.学习重点2.回顾MVC3.回顾servlet4.初始SpringMVC4.1.为什么要学SpringMVC?4.2.SpringMVC的中重点DispatcherServlet4.3.SpringMVC项目的搭建4.4.MVC框架要做哪些事情?4.5.可能会遇到的问题 5.SpringMVC的执行原理6.使用注解开发SpringMVC7.Controller控制总结8.RestF…

腾讯地图的(地图选点|输入模糊匹配)

1.支持用户输入框输入进行模糊匹配获取详细地址以及经纬度2.支持用户模糊匹配后点击选点获取详细地址以及经纬度 1.支持用户输入框输入进行模糊匹配获取详细地址以及经纬度2.支持用户模糊匹配后点击选点获取详细地址以及经纬度 <template><div class"tencentMap-…

Web 服务器-Tomcat

文章目录 Web服务器一、Tomcat简介二、基本使用三、在IDEA中创建Maven Web项目四、在IDEA中使用Tomcat Web服务器 一、Tomcat简介 二、基本使用 三、在IDEA中创建Maven Web项目 四、在IDEA中使用Tomcat

首个ChatGPT机器人- Figure 01;李开复旗下零一万物推出Yi系列AI大模型API

&#x1f989; AI新闻 &#x1f680; 首个ChatGPT机器人- Figure 01 摘要&#xff1a;Figure 01是一个由初创公司Figure联合OpenAI开发的人形机器人。它展示了与人类和环境互动的能力&#xff0c;可以说话、看东西&#xff0c;并且可以执行各种任务&#xff0c;如递食物、捡垃…

SIP调试之SIPP测试工具

SIPP是针对SIP协议的一个性能测试的命令行工具&#xff0c;可以动态显示测试的统计信息&#xff08;如呼叫速率、延时、消息统计等&#xff09;。用户可以通过XML场景配置文件&#xff0c;自定义模拟各种UAC/UAS测试场景的信令交互流程&#xff0c;可以被用来测试IP话机、SIP代…

初识微信小程序之swiper和swiper-item的基本使用

在我还没接触到微信小程序之前&#xff0c;通常使用轮播要么手写或使用swiper插件去实现&#xff0c;当我接触到微信小程序之后&#xff0c;我看到了微信小程序的强大之处&#xff0c;让我为大家介绍一下吧&#xff01; swiper与swiper-item一起使用可以做轮播图 基本使用&…

软件无线电系列——带通信号采样定理

本节目录 一、带通信号采样定理 1、带通信号采样定理的定义 2、带通信号采样定理的证明本节内容 一、带通信号采样定理 1、带通信号采样定理的定义 Nyquist采样定理是对频谱分布在(0,fH)上的基带信号的采样分析的&#xff0c;如果信号的频谱分布在某一限定的频带(fL,fH)上&…

【unity与android的交互(一)】安卓打包相关的常见参数详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

hadoop单机ssh免密登录

1. 在hadoop目录下生成密钥对 [rootmaster centos]# cd /usr/apps/hadoop-2.7.1/ [rootmaster hadoop-2.7.1]# ssh-keygen -t rsa //在hadoop目录下生成密钥对 2.找到密钥对的位置 [rootmaster hadoop-2.7.1]# find / -name .ssh //找到密钥对的位置 cd [rootmaster hadoo…

vscode 运行 java 项目之解决“Build failed, do you want to continue”的问题

Visual Studio Code运行 java 起来似乎比 IDEA 更轻量、比 eclipse 更友好&#xff0c;是不可多得的现代编译法宝。 安装好官方推荐的 java 扩展包后&#xff0c;就可以运行 java 代码了。功能 比 code runner 强&#xff0c;支持 gradle、maven、普通java项目&#xff0c;运行…

深度学习 Day27——J7对于ResNeXt-50算法的思考

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 文章目录 前言问题分析 前言 关键问题&#xff1a;ResNeXt-50中conv_shortcutFalse时…

Windows蓝牙驱动开发之模拟HID设备(一)(把Windows电脑模拟成蓝牙鼠标和蓝牙键盘等设备)

by fanxiushu 2024-03-14 转载或引用请注明原作者 把Windows电脑模拟成蓝牙鼠标和蓝牙键盘&#xff0c;简单的说&#xff0c;就是把笨重的PC电脑当成鼠标键盘来使用。 这应该是一个挺小众的应用&#xff0c;但有时感觉也应该算比较好玩吧&#xff0c; 毕竟实现一种一般人都感觉…

中值定理j

f ( n ) ( ξ ) 0 f^{(n)}(\xi)0 f(n)(ξ)0

MATLAB编译器配置:MinGW

使用 MATLAB 2022b版本&#xff0c;查询编译器时如上&#xff0c;想安装个MinGW编译器&#xff0c;自带的附加资源管理不好使&#xff0c;只能换个别的法子&#xff0c;经过一些参考&#xff0c;总结如下。 步骤1.在这里下载一个MinGW.最新版本是10.3.0.然后默认安装&#xff…

获取源数据推送到Kafka

打开BigData-KongGuan项目 打开BigData-KongGuan项目&#xff0c;在上一个任务&#xff08;“用户登录”&#xff09;的基础上继续完成本阶段任务。初始化加载SpringBoot项目的代码所在位置src/main/java/com/qrsoft/BigDataKongGuanApplication.java &#xff0c;代码如下&am…