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

本文主要是介绍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;
}

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

制作不易,给个小赞!

                  

这篇关于ElasticSearch 实现 全文检索 支持(PDF、TXT、Word、HTML等文件)通过 ingest-attachment 插件实现 文档的检索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/353818

相关文章

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

Gin框架中的GET和POST表单处理的实现

《Gin框架中的GET和POST表单处理的实现》Gin框架提供了简单而强大的机制来处理GET和POST表单提交的数据,通过c.Query、c.PostForm、c.Bind和c.Request.For... 目录一、GET表单处理二、POST表单处理1. 使用c.PostForm获取表单字段:2. 绑定到结

springMVC返回Http响应的实现

《springMVC返回Http响应的实现》本文主要介绍了在SpringBoot中使用@Controller、@ResponseBody和@RestController注解进行HTTP响应返回的方法,... 目录一、返回页面二、@Controller和@ResponseBody与RestController

nginx中重定向的实现

《nginx中重定向的实现》本文主要介绍了Nginx中location匹配和rewrite重定向的规则与应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 目录一、location1、 location匹配2、 location匹配的分类2.1 精确匹配2

Nginx之upstream被动式重试机制的实现

《Nginx之upstream被动式重试机制的实现》本文主要介绍了Nginx之upstream被动式重试机制的实现,可以通过proxy_next_upstream来自定义配置,具有一定的参考价值,感兴... 目录默认错误选择定义错误指令配置proxy_next_upstreamproxy_next_upst

nginx生成自签名SSL证书配置HTTPS的实现

《nginx生成自签名SSL证书配置HTTPS的实现》本文主要介绍在Nginx中生成自签名SSL证书并配置HTTPS,包括安装Nginx、创建证书、配置证书以及测试访问,具有一定的参考价值,感兴趣的可... 目录一、安装nginx二、创建证书三、配置证书并验证四、测试一、安装nginxnginx必须有"-