Elasticsearch:如何对PDF文件进行搜索
Elasticsearch 通常用于字符串,数字,日期等数据类型的检索,但是在 HCM、ERP 和电子商务等应用程序中经常存在对办公文档进行搜索的需求。今天的这篇文章中我们来讲一下如何实现 PDF、DOC、XLS 等办公文件的搜索,本解决方案适用于 Elasticsearch 5.0 以后的版本。
实现原理
首先把我们的 .pdf 文件进行 Base64 处理,然后上传到 Elasticsearch 中的 ingest node 中进行处理。我们可以通过 Ingest attachment plugin 来使得 Elasticsearch 提取通用格式的文件附件比如 PPT、XLS及PDF。最终,数据进入到 Elasticsearch 的 data node 中以便让我们进行搜索。
导入PDF文件到Elasticsearch中
准备PDF文件
我们可以使用 Word 或其它编辑软件来生产一个 PDF 文件,暂且我们叫这个文件的名字为 sample.pdf,而它的内容非常简单,在 sample.pdf 文件中,我们只有一句话:“I like this useful tool”。
安装 Ingest attachment plugin
Ingest attachment plugin 允许 Elasticsearch 通过使用 Apache 文本提取库 Tika 提取通用格式(例如:PPT,XLS 和 PDF)的文件附件。Apache Tika 工具包可从一千多种不同的文件类型中检测并提取元数据和文本。所有这些文件类型都可以通过一个界面进行解析,从而使 Tika 对搜索引擎索引,内容分析,翻译等有用。
需要注意的是,源字段必须是 Base64 编码的二进制,如果不想增加在 Base64 之间来回转换的开销,则可以使用 CBOR 格式而不是 JSON,并将字段指定为字节数组而不是字符串表示形式,这样处理器将跳过 Base64 解码。
可以使用插件管理器安装此插件,该插件必须安装在集群中的每个节点上,并且每个节点必须在安装后重新启动。
sudo bin/elasticsearch-plugin install ingest-attachment
等我们安装好这个插件后,我们可以通过如下的命令来查看该插件是否已经被成功安装好了:
./bin/elasticsearch-plugin list
创建 attachment pipeline
在我们的 ingest node 上创建一个叫做 pdfattachment 的 pipleline:
PUT _ingest/pipeline/pdfattachment
{
"description": "Extract attachment information encoded in Base64 with UTF-8 charset",
"processors": [
{
"attachment": {
"field": "file"
}
}
]
}
转换并上传PDF文件的内容到Elasticsearch中
对于 Ingest attachment plugin 来说,它的数据必须是 Base64 的。我们可以在网站Base64 encoder 来进行转换,我们可以直接通过下面的脚本来进行操作:
!/bin/bash
encodedPdf=`cat sample.pdf | base64`
json="{\"file\":\"${encodedPdf}\"}"
echo "$json" > json.file
curl -XPOST 'http://localhost:9200/pdf-test1/_doc?pipeline=pdfattachment&pretty' -H 'Content-Type: application/json' -d @json.file
在上面的脚本中,我们针对 sample.pdf 进行 Base64 的转换,并生成一个叫做 json.file 的文件。在最后,我们把这个 json.file 文件的内容通过 curl 指令上传到 Elasticsearch 中,我们可以在 Elasticsearch 中查看一个叫做 pdf-test1 的索引。
查看索引并搜索
可以通过如下的命令来查询 pdf-test1 索引:
GET pdf-test1/_search
可以看出来,我们的索引中有一个叫做 content 的字段,它包含了我们的 pdf 文件的内容,这个字段可以同我们进行搜索。在上面我们也看到了一个很大的一个字段 file,它含有我们转换过的 Base64 格式的内容。如果我们不想要这个字段,我们可以通过添加另外一个 remove processor 来除去这个字段:
PUT _ingest/pipeline/pdfattachment
{
"description": "Extract attachment information encoded in Base64 with UTF-8 charset",
"processors": [
{
"attachment": {
"field": "file"
}
},
{
"remove": {
"field": "file"
}
}
]
}
文章转载自:https://mp.weixin.qq.com/s/i9R4RElwqRl3mSr0ZLGaog
Elasticsearch:如何对PDF文件进行搜索的更多相关文章
- WinEdt 6+SumatraPDF -- 实现TeX文档和PDF文件正反向搜索
这几天试用了新出不久的WinEdt 6,结合PDF文件的阅读器SumatraPDF,感觉实现TeX文档和PDF文件之间的正反向搜索十分便利,故此向大家特别推荐! CTeX v2.8版本的一项重要功能是 ...
- Web方式预览Office/Word/Excel/pdf文件解决方案
最近在做项目时需要在Web端预览一些Office文件,经过在万能的互联网上一番搜索确定并解决了. 虽然其中碰到的一些问题已经通过搜索和自己研究解决了,但是觉得有必要将整个过程记录下来,以方便自己以后查 ...
- IOS下载查看PDF文件(有下载进度)
IOS(object-c) 下载查看 PDF 其实还是蛮容易操作的.在下载前,首先要把 IOS 可以保存文件的目录给过一遍: IOS 文件保存目录 IOS 可以自定义写入的文件目录,是很有限的,只能是 ...
- 利用FlashPaper在web页面中显示PDF文件(兼容各浏览器)
应项目需求要把PDF内嵌到网页中显示,其中有了很多办法,比如用<embed/>元素放入PDF文件,但是效果不理想,浏览器兼容不理想,在ie9/8(其他版本没有测试)显示会提示下载pdf文件 ...
- 将pdf文件通过itunes直接拖到ipad的ibooks里面
开始不太清楚进行过什么设置,使得以前可以直接通过拖动的方式复制pdf文件到ipad里面的方法不管用了.在帖子http://bbs.weiphone.com/read-htm-tid-864091-pa ...
- [原创]使用Pandoc实现Markdown文件转PDF文件
Markdown写法简单明快,我十分喜欢,以至于我最近都想使用Markdown快速的进行测试说明书的写作,但是考虑到这文档是要进行交接的,一个.md的文件在内部传输还是有不便,于是就想到了能不能把Ma ...
- [轉載]史上最强php生成pdf文件,html转pdf文件方法
之前有个客户需要把一些html页面生成pdf文件,然后我就找一些用php把html页面围成pdf文件的类.方法是可谓是找了很多很多,什么html2pdf,pdflib,FPDF这些都试过了,但是都没有 ...
- 利用ITextSharp导出PDF文件
最近项目中需要到处PDF文件,最后上网搜索了一下,发现ITextSharp比较好用,所以做了一个例子: public string ExportPDF() { //ITextSharp Usage / ...
- 用火狐打开PDF文件
可以直接使用官方的Adobe Reader插件来实现在火狐中浏览PDF文件的功能.在你浏览一个PDF文件的时候,火狐将会尝试下载安装这个插件. 如果这个插件出现问题,那么就无计可施啦. 检查火狐的设置 ...
随机推荐
- 适用于MES、WMS、ERP等管理系统的实体下拉框设计
场景 该设计多适用于MES,ERP,WMS 等管理类型的项目. 在做管理类型项目的时候,前端经常会使用到下拉框,比如:设备,工厂等等.下拉组件中一般只需要他们的ID,Name属性,而这些数据都创建于其 ...
- Vue 路由懒加载, VueRouter一步完成Vue的路由懒加载 一行代码搞定懒加载
Vue Router路由配置中的component里面配置即可 1 // 路由懒加载的方式加载组件 2 3 component: () => import('@/views/Detail'), ...
- .NET 使用自带 DI 批量注入服务(Service)和 后台服务(BackgroundService)
今天教大家如何在asp .net core 和 .net 控制台程序中 批量注入服务和 BackgroundService 后台服务 在默认的 .net 项目中如果我们注入一个服务或者后台服务,常规的 ...
- NOI / 1.2编程基础之变量定义、赋值及转换全题详解(5063字)
目录 01:整型数据类型存储空间大小 02:浮点型数据类型存储空间大小
- 【每天学一点-05】使用umi.js代理,解决跨域问题(前端)
一.user.ts 前端请求接口 import request from 'umi-request'; const getAway = '/user'; // 获取用户列表 export const ...
- flex这些问题应该被理解
flex三连问,帮助我们更好的理解布局利器 问题: flex的值 auto, none, 0, 1, initial分别是什么?有什么作用?有什么表现? flex-basis和width的区别?单值f ...
- 题解【洛谷 P1466 [USACO2.2]集合 Subset Sums】
题目传送门 设 \(sum=1+2+3+4+\dots+n=\dfrac{n(n+1)}{2}\). 如果 \(2\nmid sum\),则显然没有方案. 如果 \(2\mid sum\),则这两个集 ...
- YII容器类依赖注入
程序 = 算法 + 数据结构 数据结构 制约了 算法的===>>>>依赖注入 依赖注入也就是解数据结构和算法耦合的思想 <?php /** * Created by Ph ...
- MySQL8.0解决“MySQL 服务无法启动。 服务没有报告任何错误。”
TL;NRs 初始化服务时最好使用mysqld --initialized --console命令: MySQL8.0的配置变量与MySQL5.7不同,[mysqld]下面设置字符集的变量名为char ...
- anltr 解析MYSQL
String sql = "select a as c,b as s,'zhange' F, 1/5 as e from t_order"; final MysqlQueryLex ...