使用ES检索PDF或Word等格式文件方案

高分请问一下,使用ES检索PDF或Word等格式文件方案
最新回答
东风软

2024-11-27 14:12:26

ES检索PDF/Word等格式文件方案插件安装

ES自带文档预处理插件,但7.x版本默认发版包不含ingest attachment plugin。

通过摄取附件插件,Elasticsearch可利用Apache文本提取库Tika提取常见格式文件附件(如PPT、XLS和PDF)。

源字段需为base64编码的二进制文件。为减少base64转换开销,可用CBOR格式而非JSON,字段指定为字节数组而非字符串。处理器将跳过base64解码。

在线安装

以下命令直接联网下载插件并安装

离线安装

官网有说明:This plugin can be downloaded for offline install from artifacts.elastic.co/do....

注意:集群所有ES服务实例需安装此插件!

最后,重启ElasticSearch全部服务。

构建管道

在Kibana中执行:

上述命令返回:

在attachment中指定要预处理的字段为content,因此写入Elasticsearch时需将文档内容放在content字段。

建立文档结构映射

为提高搜索效果,需建立文档结构映射,定义文本文件通过预处理器上传后存储形式。

使用PUT指令创建docwrite索引,用于接收测试数据。

首先,需确保ES已安装中文分词器ik插件,此处不再赘述。

上述请求返回:

attachment字段为attachment命名pipeline抽取文档附件文本后自动附加的字段。这是一个嵌套字段,包含多个子字段,包括抽取文本content和一些文档信息元数据。

测试

因ElasticSearch基于JSON格式文档数据库,所以附件文档插入前需进行Base64编码。先通过以下网站将PDF文件转化为Base64文本:

这是一个在线PDF转base64的小网站,可能含有广告,有可能不可用:toolfk.com/tools/pdf-to...

使用上述网站只能转换小文件,我转换一个10页PPT后页面无响应,无法拷贝结果。

随后,我转换了一个更小PDF,可复制结果,发现字符数有41万之多。

注意,ES默认限制一个字段只能索引最大10万个字符,因此需修改管道参数(改为100万),也可改为无限制但最好不要这样做:

写入文档内容并索引查询测试

返回:能够查到1条结果(但目前只有这一条结果)。

作为对比,我们将本文档也转码为Base64格式上传。

然后继续搜索"内存泄漏"只出现第一篇文档,而搜Base64只出现第二篇文档。

过程中解决了ES请求体过大和Kibana无法发送大请求的问题!(对于生产环境是必须的!)

方案可行

后期,后端只需使用Java API实现程序化转码PDF并上传。

建设思路

使用git hook实时监控触发,或直接简单使用定时任务从文件源下载pdf、word、md等格式文档,使用java将文档内容转成Base64格式,仿照上述思路方法写入ES,即可实现全文搜索,搜索到的文档可返回在线下载地址,可直接打开或下载,完成闭环。