ElasticSearch 实现 全文检索 支持(PDF、TXT、Word、HTML等文件)通过 ingest-attachment 插件实现 文档的检索
一、Attachment 介绍
Attachment 插件是 Elasticsearch 中的一种插件,允许将各种二进制文件(如PDF、Word文档等)以及它们的内容索引到 Elasticsearch 中。插件使用 Apache Tika 库来解析和提取二进制文件的内容。通过使用 Attachment 插件,可以轻松地在 Elasticsearch 中建立全文搜索功能,而无需事先转换二进制文件为文本。
优点:
可以将各种类型的二进制文件以原始形式存储在 Elasticsearch 中。这使得保存和访问二进制文件变得更加简单和高效。
插件使用 Apache Tika 库来解析和提取二进制文件的内容,因此可以提取并存储内容、元数据以及格式化的文本数据。这使得 Elasticsearch 可以轻松地对文档执行全文搜索以及文档内容的其他分析操作。
在 Elasticsearch 中使用 Attachment 插件,可以轻松地实现以下一些功能:搜索文档、生成全文搜索报告、自动标记文件、提取数据并进行分析,在文档中查找特定项等。
缺点:
Attachment 插件对性能有一定的影响,因为执行全文搜索需要解析和提取二进制文件的内容。如果处理大量的二进制文件,可能会影响搜索性能。
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;
}
完整代码可通过: 完整代码包下载
制作不易,给个小赞!
相关文章:
ElasticSearch 实现 全文检索 支持(PDF、TXT、Word、HTML等文件)通过 ingest-attachment 插件实现 文档的检索
一、Attachment 介绍 Attachment 插件是 Elasticsearch 中的一种插件,允许将各种二进制文件(如PDF、Word文档等)以及它们的内容索引到 Elasticsearch 中。插件使用 Apache Tika 库来解析和提取二进制文件的内容。通过使用 Attachment 插件&a…...
【Head First 设计模式】-- 策略模式
一、背景 Head First 设计模式第一章设计模式入门–策略模式 二、工具箱的工具(本章) 1、OO基础 封装 继承 多态 抽象 2、OO原则 封装变化 面向接口编程,而非面向实现编程 组合优于继承 3、OO模式 策略模式,所谓策略模式就是定义…...
能链智电,“重”症在身
文 | 智能相对论 作者 | 陈选滨 在过去的1-9月,充电基础设施增量为243.2万台,新能源汽车销量627.8万辆,充电桩与新能源汽车的增量比为1:2.6,距离工信部此前提出“2025年实现车桩比2:1,2030年实现车桩比1:…...
python 视频硬字幕去除 内嵌字幕去除工具 vsr
项目简介 开源地址:https://github.com/YaoFANGUK/video-subtitle-remover Video-subtitle-remover (VSR) 是一款基于AI技术,将视频中的硬字幕去除的软件。 主要实现了以下功能: 无损分辨率将视频中的硬字幕去除,生成去除字幕后…...
蓝桥等考C++组别六级004
第一部分:选择题 1、C L6 (15分) 关于switch语句,以下说法正确的是( )。 A. break语句只能用于switch语句。 B. switch语句中可以使用多个default语句。 C. switch语句中只能使用一个break语句。 D. …...
SpringBoot之Swagger
文章目录 前言一、Swagger简介二、SpringBoot集成Swagger三、配置Swagger四、配置扫描接口五、配置Swagger开关六、配置API分组七、实体配置八、常用注解 前言 作为后端开放人员,最烦的事就是自己写接口文档和别人没有写接口文档,不管是前端还是后端开发…...
抖音小店新的流量变现新时代!
随着短视频平台的日益崛起,抖音小店已成为电商领域的一股不可忽视的力量。抖音小店不仅具有极高的流量优势,还为众多商家提供了一个全新的销售渠道。那么,如何才能充分利用抖音小店的优势,打造出爆款商品,实现流量变现…...
软件架构师
软件架构师在软件开发过程中扮演着至关重要的角色,其主要职责包括: 需求分析:与用户和开发团队沟通,确定软件的需求和功能。设计架构:根据需求分析,设计软件的架构,包括系统架构、数据库架构、…...
postman接口测试
postman使用 开发中经常用postman来测试接口,一个简单的注册接口用postman测试: 接口正常工作只是最基本的要求,经常要评估接口性能,进行压力测试。 postman进行简单压力测试 下面是压测数据源,支持json和csv两个格式…...
技术分享 | web自动化测试-PageObject 设计模式
为 UI 页面写测试用例时(比如 web 页面,移动端页面),测试用例会存在大量元素和操作细节。当 UI 变化时,测试用例也要跟着变化, PageObject 很好的解决了这个问题。 使用 UI 自动化测试工具时(包…...
Mall4cloud 微服务商城系统 2.0 发布
导读现在 jdk17 和 spring boot 以及 spring cloud alibaba 2022 的第三方依赖已经趋于成熟,所以 mall4cloud 也一把梭哈做了升级嗷。 本次更新重点: 系统由 jdk8 最低要求升级到 jdk17spring boot 由 2.7.x 升级到 3.1.xjavax 升级到 jakartaspring-cl…...
SpringBoot进制转换规则问题
1.填写yml文件 dataSource:driver-class-name: com.mysql.jdbc.Driver789password: 01272.测试类 package com.forever;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.Spri…...
12.输入一个小于1000的整数,输出平方根(不是整数,输出整数部分)
#include<stdio.h> #include<math.h>int fun(int n){int b;b pow(n,0.5);printf("%d",b);}int main(){int n;scanf("%d",&n); fun(n);return 0;}...
Django框架的推导
文章目录 Web应用简介什么是Web框架?什么是Web?应用程序的两种模式Web应用程序的优缺点 手写Web框架HTTP协议的相关知识1.四大特性2.请求数据格式3.响应数据格式 手写框架 使用wsgiref模块基于wsgiref模块搭建Web框架(最初版)基于wsgiref模块搭建Web框架…...
广东开放大学:电大搜题助力学子迎考利器
近年来,广东开放大学一直致力于为广大学子提供优质的教育资源和学习服务。作为一所专注于远程教育的学府,广东开放大学不仅拥有雄厚的师资力量和丰富的教育经验,还致力于创新教学手段,为学生提供更便捷、高效的学习体验。在这个信…...
linux 7za 编译安装
本文主要介绍了在linux下安装7z命令的方法,同时介绍了7z命令的使用。7z压缩格式拥有众多优点,具有极高的压缩比率 wget https://zenlayer.dl.sourceforge.net/project/p7zip/p7zip/16.02/p7zip_16.02_src_all.tar.bz2 tar -xjvf p7zip_16.02_src_all.ta…...
【Edge】微软Edge每次启动自动导入Chrome收藏夹,无法取消“每次启动浏览器时导入浏览数据”功能的解决方法(202311)
写在前面 Edge现在也不管用户体验了吗? 这个BUG都快一个月了,还没见修复,从118.0.2088开始,我是在2023年10月份一次更新后发现的这个BUG,结果社区论坛什么信息都没有,英文也没收到。 Edge的BUG现象 不知道哪次Edge…...
报错RuntimeError: no valid convolution algorithms available in CuDNN
报错信息如下RuntimeError: no valid convolution algorithms available in CuDNN 出现这个问题既不是cuda与cudnn版本不匹配,也不是英伟达显卡驱动需要更新!而是因为你的显存过低不能训练,解决办法是使用混精度训练!!…...
JSP通用材料收集归档系统eclipse定制开发mysql数据库BS模式java编程jdbc
一、源码特点 JSP 通用材料收集归档系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0,…...
网络安全-零基础小白自学要点
1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…...
Qt桌面应用集成PaddleOCR:从环境搭建到精准识别的实践指南
1. 环境准备:搭建PaddleOCR的Qt开发环境 第一次在Qt里折腾PaddleOCR时,我对着官方文档折腾了半天还是报错,后来发现是第三方库的路径没配好。这里分享下我踩坑后总结的可靠方案。 核心依赖三件套:PaddlePaddle推理库、PaddleOCR C…...
告别台式机没麦克风的尴尬:用SonoBus+VB-Cable把手机秒变无线麦(保姆级配置)
台式机零成本无线麦克风方案:SonoBus与VB-Cable实战指南 你是否遇到过这样的尴尬时刻——台式电脑突然需要语音沟通,却发现没有麦克风?无论是紧急会议、游戏开黑还是直播互动,这种硬件缺失带来的困扰可能让你措手不及。本文将介绍…...
工具调用准确率飙到95%!Qwen-7B解耦微调实战实录(非常详细),大模型调优从入门到精通,收藏这一篇就够了!
用Qwen-7B做Agent,本来信心满满,结果MCP一跑,选工具选不对、参数填得稀巴烂,准确率惨不忍睹,最高也就60%徘徊。 后来我发现:普通LoRA根本救不了复杂工具调用。 真正能救命的,是2026年最火的解…...
期权到期日别慌!手把手教你搞定上交所股票期权的行权与交割(附避坑清单)
期权到期日实战指南:从行权准备到交割避坑全流程解析 手机屏幕上的红色倒计时提醒着期权合约即将到期,作为刚接触期权交易不久的新手,此刻最需要的不再是复杂的概念解释,而是一份能握在手中的应急操作清单。本文将用最直白的语言拆…...
如何通过WeChatMsg实现微信聊天记录永久保存:从数据安全到情感记忆的完整解决方案
如何通过WeChatMsg实现微信聊天记录永久保存:从数据安全到情感记忆的完整解决方案 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.co…...
【Windows】终止进程、杀掉进程、结束进程
使用资源监视器在任务管理器中点击"性能"选项卡点击"打开资源监视器"切换到"CPU"选项卡在"关联的句柄"搜索框中输入 ui_demo.exe找到对应的进程后,右键点击并选择"结束进程"...
GPIO输出模式详解:推挽与开漏对比与应用
1. GPIO输出模式基础概念在嵌入式系统开发中,GPIO(General Purpose Input/Output)是最基础也是最常用的外设之一。作为硬件工程师,深入理解GPIO的不同工作模式对于电路设计和程序开发都至关重要。今天我们就来详细剖析GPIO的两种主要输出模式:…...
本地Cookie管理工具:安全导出与高效应用指南
本地Cookie管理工具:安全导出与高效应用指南 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 在当今数字化环境中,Cookie作为…...
手机关键词 SEO 优化与网站速度优化有什么关系_手机关键词 SEO 优化与内容营销策略有什么联系
手机关键词 SEO 优化与网站速度优化有什么关系 在当今数字化时代,网站的流量和用户体验直接影响企业的品牌价值和市场竞争力。手机关键词 SEO 优化与网站速度优化这两个看似独立的环节,实际上有着密不可分的联系。本文将详细探讨它们之间的关系…...
弹幕盒子:5分钟掌握专业弹幕制作,零基础也能轻松上手
弹幕盒子:5分钟掌握专业弹幕制作,零基础也能轻松上手 【免费下载链接】danmubox.github.io 弹幕盒子 项目地址: https://gitcode.com/gh_mirrors/da/danmubox.github.io 你是否曾为视频制作寻找合适的弹幕工具而烦恼?想要给视频添加互…...
