ElasticSearch 实现 全文检索 支持(PDF、TXT、Word、HTML等文件)通过 ingest-attachment 插件实现 文档的检索

一、Attachment 介绍

Attachment 插件是 Elasticsearch 中的一种插件,允许将各种二进制文件(如PDF、Word文档等)以及它们的内容索引到 Elasticsearch 中。插件使用 Apache Tika 库来解析和提取二进制文件的内容。通过使用 Attachment 插件,可以轻松地在 Elasticsearch 中建立全文搜索功能,而无需事先转换二进制文件为文本。

优点:

  1. 可以将各种类型的二进制文件以原始形式存储在 Elasticsearch 中。这使得保存和访问二进制文件变得更加简单和高效。

  2. 插件使用 Apache Tika 库来解析和提取二进制文件的内容,因此可以提取并存储内容、元数据以及格式化的文本数据。这使得 Elasticsearch 可以轻松地对文档执行全文搜索以及文档内容的其他分析操作。

  3. 在 Elasticsearch 中使用 Attachment 插件,可以轻松地实现以下一些功能:搜索文档、生成全文搜索报告、自动标记文件、提取数据并进行分析,在文档中查找特定项等。

缺点:

  1. Attachment 插件对性能有一定的影响,因为执行全文搜索需要解析和提取二进制文件的内容。如果处理大量的二进制文件,可能会影响搜索性能。

  2. Attachment 插件有一些限制,例如插件不支持对二进制文件进行过滤或排除,因此如果文件内容包含敏感信息,则不应使用 Attachment 插件进行索引。

二、初始化 ingest-attachment

1、windows安装

 1、先在ES的bin目录下执行命令 安装 ngest-attachment插件

elasticsearch-plugin install ingest-attachment

作者已经安装过了 所以不能重复安装,插件下载过程中会出现

2、Liunx安装 

通过官网下载,找到对应的版本号:attachment下载网站

下载好后上传到服务器,进入elasticsearch安装目下的bin目录下。
执行sudo ./elasticsearch-plugin install file:///home/ingest-attachment-7.9.0.zip 即可
重启ES  打印 [apYgDEl] loaded plugin [ingest-attachment] 表示安装成功

3、小结

安装完成后需要重新启动ES

接下来我们需要创建一个关于ingest-attachment的文本抽取管道

PUT /_ingest/pipeline/attachment
{"description": "Extract attachment information","processors": [{"attachment": {"field": "content","ignore_missing": true}},{"remove": {"field": "content"}}]
}

后续我们的文件需要base64后储存到 attachment.content 索引字段中

三、如何应用?

1、通过命令语句简易检索

# 创建一个ES 索引 并且添加一些测试数据

POST /pdf_data/_doc?pretty
{"id": "3","name": "面试题文件1.pdf","age": 18,"type": "file","money": 1111,"createBy": "阿杰","createTime": "2022-11-03T10:41:51.851Z","attachment": {"content": "面试官:如何保证消息不被重复消费啊?如何保证消费的时候是幂等的啊?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?","date": "2022-11-02T10:41:51.851Z","language": "en"}
}

# 通过插入的文档内容为条件进行检索

# 简单 单条件查询 文档内容检索
GET /pdf_data/_search
{"query": {"match": {"attachment.content": "面试官:如何保证消息不被重复消费啊?如何保证消费的时候是幂等的啊?"}}
}

2、整合java代码实现ES通过ingest-attachment进行全文检索

 1、首先将文件转为BASE64进行ES数据插入

/*** 将文件 文档信息储存到数据中* @param file* @return*/@PostMapping("/insertFile")@ApiOperation(value="创建索引ES-传入ES索引-传入文件", notes="创建索引ES-传入ES索引-传入文件")public IndexResponse insertFile(@RequestAttribute("file") MultipartFile file,@RequestParam("indexName")String indexName){FileObj fileObj = new FileObj();fileObj.setId(String.valueOf(System.currentTimeMillis()));fileObj.setName(file.getOriginalFilename());fileObj.setType(file.getName().substring(file.getName().lastIndexOf(".") + 1));fileObj.setCreateBy(RandomNameGenerator.generateRandomName());fileObj.setCreateTime(String.valueOf(System.currentTimeMillis()));fileObj.setAge(RandomNameGenerator.getAge());fileObj.setMoney(RandomNameGenerator.getMoney());// 文件转base64byte[] bytes = new byte[0];try {bytes = file.getBytes();//将文件内容转化为base64编码String base64 = Base64.getEncoder().encodeToString(bytes);fileObj.setContent(base64);IndexResponse indexResponse=  ElasticsearchUtil.upload(fileObj,indexName);if (0==indexResponse.status().getStatus()){// 索引创建并插入数据成功System.out.println("索引创建并插入数据成功");}return indexResponse;} catch (Exception e) {e.printStackTrace();}return null;}

 2、创建索引、插入数据,并且将文档数据抽取到管道中

    @Autowiredprivate RestHighLevelClient restHighLevelClient;private  static  RestHighLevelClient levelClient;@PostConstructpublic void initClient() {levelClient = this.restHighLevelClient;}/*** 创建索引并插入数据* @param file* @param indexName* @return* @throws IOException*/public static IndexResponse upload(FileObj file,String indexName) throws IOException {// TODO 创建前需要判断当前文档是否已经存在if (!isIndexExist(indexName)) {CreateIndexRequest request = new CreateIndexRequest(indexName);// 如果需要ik分词器就添加配置,不需要就注释掉 // 添加 IK 分词器设置  ik_max_word
//            request.settings(Settings.builder()
//                    .put("index.analysis.analyzer.default.type", "ik_max_word")
//                    .put("index.analysis.analyzer.default.use_smart", "true")
//            );// 添加 IK 分词器设置 ik_smart request.settings(Settings.builder().put("index.analysis.analyzer.default.type", "ik_smart"));CreateIndexResponse response = levelClient.indices().create(request, RequestOptions.DEFAULT);log.info("执行建立成功?" + response.isAcknowledged());}IndexRequest indexRequest = new IndexRequest(indexName);//上传同时,使用attachment pipline进行提取文件indexRequest.source(JSON.toJSONString(file), XContentType.JSON);indexRequest.setPipeline("attachment");IndexResponse indexResponse= levelClient.index(indexRequest,RequestOptions.DEFAULT);System.out.println(indexResponse);return indexResponse;}

  3、其他代码补充

   ES Config 配置类 

/*** ES配置类* author: 阿杰*/
@Configuration
public class ElasticSearchClientConfig {/*** ES 地址:127.0.0.1:9200*/@Value("${es.ip}")private String hostName;@Beanpublic RestHighLevelClient restHighLevelClient() {String[] points = hostName.split(",");HttpHost[] httpHosts = new HttpHost[points.length];for (int i = 0; i < points.length; i++) {String point = points[i];httpHosts[i] = new HttpHost(point.split(":")[0], Integer.parseInt(point.split(":")[1]), "http");}RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(httpHosts));return client;}@Beanpublic ElasticsearchUtil elasticSearchUtil() {return new ElasticsearchUtil();}}

数据插入使用的实体类

/*** author: 阿杰*/
@Data
public class FileObj {/*** 用于存储文件id*/String id;/*** 文件名*/String name;/*** 文件的type,pdf,word,or txt*/String type;/*** 数据插入时间*/String createTime;/*** 当前数据所属人员*/String createBy;/*** 当前数据所属人员的年龄*/int age;/*** 当前数据所属人员的资产*/int money;/*** 文件转化成base64编码后所有的内容。*/String content;
}

 完整代码可通过: 完整代码包下载

制作不易,给个小赞!

                  

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt的事件

一、鼠标按下事件 //鼠标按下事件&#xff0c;获取屏幕位置&#xff0c;并显示&#xff0c;移动显示框 void Widget::mousePressEvent(QMouseEvent *event) {if(event->button() ! Qt::LeftButton){return ;}QPoint point event->pos();QPointF winPt event->…

Python学习-shutil模块和OS模块学习

shutil模块 针对文件的拷贝&#xff0c;删除&#xff0c;移动&#xff0c;压缩和解压操作 # 1.copyfileobj只能复制文件内容&#xff0c;无法复制权限#复制文件时&#xff0c;要选择自己有权限的目录执行操作&#xff0c;创建的文件会根据系统umask设定的参数来指定用户权限 s…

首发scitb包,一个为制作统计表格而生的R包

目前&#xff0c;本人写的第3个R包scitb包已经正式在R语言官方CRAN上线&#xff0c;scitb包是一个为生成专业化统计表格而生的R包。 可以使用以下代码安装 install.packages("scitb")scitb包对我而言是个很重要的R包&#xff0c;我的很多想法需要靠它做平台来实现&a…

项目实战:优化Servlet,把所有围绕Fruit操作的Servlet封装成一个Servlet

1、FruitServlet 这些Servlet都是围绕着Fruit进行的把所有对水果增删改查的Servlet放到一个Servlet里面&#xff0c;让tomcat实例化一个Servlet对象 package com.csdn.fruit.servlet; import com.csdn.fruit.dto.PageInfo; import com.csdn.fruit.dto.PageQueryParam; import c…

多级缓存之JVM进程缓存

1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; 请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈 Redis缓存失效时&#xff0…

STM32笔记—DMA

目录 一、DMA简介 二、DMA主要特性 三、DMA框图 3.1 DMA处理 3.2 仲裁器 3.3 DMA通道 扩展: 断言&#xff1a; 枚举&#xff1a; 3.4 可编程的数据传输宽度、对齐方式和数据大小端 3.5 DMA请求映像 四、DMA基本结构 4.1 DMA_Init配置 4.2 实现DMAADC扫描模式 实现要求…

PMP考试都是什么题?

PMP考试都是选择题&#xff0c;180道选择题&#xff0c;单选170道&#xff0c;多选10道&#xff0c;告知答案选项数量。 这里分享一下PMP考试中的常见翻译问题&#xff0c;pmp干货可在文末获取。 1、题目中出现的“启动会议”或“启动大会”开工会议&#xff08;kick-off mee…

康耐视深度学习ViDi-ViDi四大工具介绍与主要用途

Cognex ViDi 工具是一系列机器视觉工具&#xff0c;通过深度学习解决各种难以解决的挑战。虽然这些工具共享一个引擎&#xff0c;但它们在图像中寻找的内容不同。更具体地说&#xff0c;在分析单个点、单个区域或完整图像时&#xff0c;每个工具都有不同的侧重点。 Locate&…

极致性能优化:前端SSR渲染利器Qwik.js | 京东云技术团队

引言 前端性能已成为网站和应用成功的关键要素之一。用户期望快速加载的页面和流畅的交互&#xff0c;而前端框架的选择对于实现这些目标至关重要。然而&#xff0c;传统的前端框架在某些情况下可能面临性能挑战且存在技术壁垒。 在这个充满挑战的背景下&#xff0c;我们引入…

基础课18——智能客服系统架构

1.基础设施层 基础设施主要包括以下几点&#xff1a; 1. 硬件设施&#xff1a;包括服务器、存储设备、网络设备等&#xff0c;这是整个系统运行的物理基础。 2. 软件设施&#xff1a;包括操作系统、数据库管理系统、自然语言处理(NLP)工具和机器学习算法等&#xff0c;这些是…

Jmeter分布式压测 —— 易踩坑点

1、压测机 无论是从成本角度还是维护的难易方面&#xff0c;压测机的数量&#xff0c;适量就好。举个例子&#xff0c;8C16G的一台服务器&#xff0c;部署Jmeter后&#xff0c;根据我个人的测试比对数据&#xff0c;配置≤1500个线程数&#xff0c;最好。太多了性能损耗较大&a…

Cannot run program “D:\c\IntelliJ IDEA 2021.1.3\jbr\bin\java.exe“

如果你的idea在打开后出现了这个故障 Cannot run program "D:\c\IntelliJ IDEA 2021.1.3\jbr\bin\java.exe" (in directory "D:\c\IntelliJ IDEA 2021.1.3\bin"): CreateProcess error2, 系统找不到指定的文件。 打开IDEA的设置 file --> settings --&…

机器人制作开源方案 | 管内检测维护机器人

一、作品简介 作者&#xff1a;李泽彬&#xff0c;李晋晟&#xff0c;杜张坤&#xff0c;禹馨雅 单位&#xff1a;运城学院 指导老师&#xff1a;薛晓峰 随着我国的社会主义市场经济的飞速发展和科学技术的革新&#xff0c;各行各业的发展越来越离不开信息化和网络化的…

【扩散模型】5、Diffusion models beat GAN | 使用类别引导图像生成

论文&#xff1a;Diffusion models beat GAN on image Synthesis 代码&#xff1a;https://github.com/openai/guided-diffusion 出处&#xff1a;OPENAI | NIPS2021 时间&#xff1a;2021 贡献&#xff1a; 在本文章之前&#xff0c;扩散模型生成的图片已经非常逼真了&am…

ubuntu20.04配置解压版mysql5.7

目录 1.创建mysql 用户组和用户2.下载 MySQL 5.7 解压版3.解压 MySQL 文件4.将 MySQL 移动到适当的目录5.更改mysql目录所属的用户组和用户&#xff0c;以及权限6.进入mysql/bin/目录&#xff0c;安装初始化7.编辑/etc/mysql/my.cnf配置文件8.启动 MySQL 服务&#xff1a;9.建立…

linux之信号

Linux之信号 什么是信号信号的产生方式signalsignactionkill信号集信号屏蔽 什么是信号 信号机制是一种使用信号来进行进程之间传递消息的方法&#xff0c;信号的全称为软中断信号&#xff0c;简称软中断。 信号的本质是软件层次上对中断的一种模拟&#xff08;软中断&#xff…

第26期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

Digicert证书是什么?

DigiCert是全球领先的数字信任提供商&#xff0c;使个人和企业能够自信地在线参与&#xff0c;相信他们在数字世界中的足迹是安全的。DigiCert通过塑造全球行业标准、提供卓越的全球合规性和运营、为公共和私人信任提供证书生命周期管理以及将信任扩展到供应链和互联生态系统&a…

QT实现的一个MVP设计模式demo

最近做qt 项目,发现网上基于MVP设计模式的QT例程很少&#xff0c;这里写一个demo示例可作为参考&#xff1a; 一、简要概述 MVP是由MVC发展而来&#xff0c;总体目的与作用相同。都是为了软件构架有层次之分&#xff0c;使得核心逻辑、界面控制、数据这三者分层清晰明了。减少…

Linux实现进度条小程序(包含基础版本和模拟下载过程版本)

Linux实现进度条小程序[包含基础版本和模拟下载过程版本] Linux实现进度条小程序1.预备的两个小知识1.缓冲区1.缓冲区概念的引出2.缓冲区的概念 2.回车与换行1.小例子2.倒计时小程序 2.基础版进度条1.的回车方式的打印2.百分比的打印3.状态提示符的打印 3.升级版进度条1.设计:进…