spring boot 2.7整合Elasticsearch Java client + ingest attachment实现文档解析

一、软件环境

软件版本号备注
Spring boot2.7.23.x版本建议使用ElasticSearch8.x
ElasticSearch7.17.4ElasticSearch 7.x 可使用JDK 8
ElasticSearch 8.x 要求使用JDK 11+

二、安装ElasticSearch

下载地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.4-linux-x86_64.tar.gz

上传压缩包至/usr/local/

cd /usr/local/
//解压
tar -xvf elasticsearch-7.17.4-linux-x86_64.tar.gz

修改配置文件/usr/local/elasticsearch-7.17.4/config/elasticsearch.yml

注意 :后面需要跟一个空格

//数据存储路径,文件不存在则先创建
path.data: /usr/local/elasticsearch-7.17.4/data
//日志存储路径
path.logs: /usr/local/elasticsearch-7.17.4/logs
//在底部增加以下内容,以便支持设置密码
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

修改内存参数配置/usr/local/elasticsearch-7.17.4/config/jvm.options,可根据实际需求配置。

-Xms512m
-Xmx512m

JDK版本兼容,该版本默认要求JDK11,系统配置了JDK8,启动时会冲突,故进行以下调整

编辑/usr/local/elasticsearch-7.17.4/bin/elasticsearch-env,注释红框部分

ElasticSearch不能以root启动,为指定用户配置权限

//ElasticSearch不能以root启动,为指定用户配置权限
chown -R 用户名:用户名 /usr/local/elasticsearch-7.17.4
//启动ElasticSearch,需切换为非root用户
/usr/local/elasticsearch-7.17.4/bin/elasticsearch -d
//配置密码,需先启动一次ElasticSearch
/usr/local/elasticsearch-7.17.4/bin/elasticsearch-setup-passwords interactive

三、安装Kibana

下载地址:https://artifacts.elastic.co/downloads/kibana/kibana-7.17.4-linux-x86_64.tar.gz

上传压缩包至/usr/local/

cd /usr/local/
//解压
tar -zxvf kibana-7.17.4-linux-x86_64.tar.gz

编辑配置文件/usr/local/kibana-7.17.4-linux-x86_64/config/kibana.yml

//端口号
server.port: 5601//服务器绑定地址,允许所有网络接口访问
server.host: "0.0.0.0"//elasticsearch账户配置
elasticsearch.username: "kibana_system"
elasticsearch.password: "密码"//中文
i18n.locale: "zh-CN"

kibana和ElasticSearch一样,不能以root启动,为指定用户配置权限

//kibana不能以root启动,为指定用户配置权限
chown -R 用户名:用户名 /usr/local/kibana-7.17.4-linux-x86_64//前台启动
/usr/local/kibana-7.17.4-linux-x86_64/bin/kibana
//后台启动
nohup /usr/local/kibana-7.17.4-linux-x86_64/bin/kibana &

四、IK中文分词器

下载地址(根据对应的ElasticSearch版本号进行下载):

https://github.com/infinilabs/analysis-ik/releases

在ElasticSearch安装路径的plugins文件夹里,创建ik文件夹,如/usr/local/elasticsearch-7.17.4/plugins/ik,解压文件放到该路径下。

重启ElasticSearch即可。

五、Spring boot整合ElasticSearch

在Es7.15版本之后,es官方将它的高级客户端RestHighLevelClient标记为弃用状态。同时推出了全新的java API客户端Elasticsearch Java API Client,该客户端也将在Elasticsearch8.0及以后版本中成为官方推荐使用的客户端。

本文直接使用Elasticsearch Java API Client,后续方便升级8.x

pom.xml中增加:

<dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>7.17.24</version>
</dependency>

配置文件:

spring.elasticsearch.uris=http://localhost:9200
spring.elasticsearch.username=elastic
spring.elasticsearch.password=*******

配置类ElasticsearchConfig:

@Configuration
public class ElasticsearchConfig {@Value("${spring.elasticsearch.uris}")private String uris;@Value("${spring.elasticsearch.username}")private String username;@Value("${spring.elasticsearch.password}")private String password;@Beanpublic ElasticsearchClient elasticsearchClient() {BasicCredentialsProvider credsProv = new BasicCredentialsProvider();credsProv.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));RestClient restClient = RestClient.builder(HttpHost.create(uris)).setHttpClientConfigCallback(hc -> hc.setDefaultCredentialsProvider(credsProv)).build();#多节点可参考/*RestClient restClient = RestClient.builder(new HttpHost("192.168.1.10", 9200),new HttpHost("192.168.1.11", 9200),new HttpHost("192.168.1.12", 9200)).build();*/ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());return new ElasticsearchClient(transport);}
}

在service类中自动装配ElasticsearchClient,后续直接使用

@Autowired
private ElasticsearchClient esClient;

六、索引相关操作

1.索引是否存在

http请求

GET /索引名称

JAVA  API

BooleanResponse existsResponse = esClient.indices().exists(builder -> builder.index("索引名称"));
if (existsResponse.value()) {//存在
}else{//不存在
}

2.创建索引

http请求

PUT /索引名称
{//指定默认分词器为ik_max_word"settings" : {"index" : {"analysis.analyzer.default.type": "ik_max_word"}},"mappings": {"properties": {"字段1": {"type": "keyword"    //keyword不进行分词},"字段2": {"type": "text"       //text进行分词},"字段3": {"type":   "date","format": "yyyy-MM-dd HH:mm:ss"}}}
}

JAVA  API

//方式一
//定义映射
TypeMapping typeMapping = new TypeMapping.Builder().properties("integer字段", p -> p.integer(i -> i)).properties("keyword字段",p->p.keyword(k -> k)).properties("text字段", p -> p.text(t -> t)).properties("日期字段", p -> p.date(d -> d.format("yyyy-MM-dd"))).properties("日期时间字段", p -> p.date(d -> d.format("yyyy-MM-dd HH:mm:ss"))).build();
esClient.indices().create(new CreateIndexRequest.Builder().index("索引名称").mappings(typeMapping).build());//方式二、根据json内容创建索引
String mappings = """{"mappings" : {"properties" : {"integer字段" : {"type" : "integer"},"keyword字段" : {"type" : "keyword"},"text字段" : {"type" : "text"},"日期字段" : {"type" : "date","index" : false,"format" : "yyyy-MM-dd"},"日期时间字段" : {"type" : "date","index" : false,"format" : "yyyy-MM-dd HH:mm:ss"}}}}""";
esClient.indices().create(new CreateIndexRequest.Builder().index("索引名称").withJson(new StringReader(mappings)).build());

3.查询索引映射信息

http请求

GET /索引名称/_mapping

JAVA  API

GetMappingResponse response = esClient.indices().getMapping(builder -> builder.index("索引名称"));
IndexMappingRecord indexMappingRecord = response.get("索引名称");
TypeMapping typeMapping = indexMappingRecord.mappings();
Map<String, Property> properties=typeMapping.properties();
List<IndexMapping> mappings=new ArrayList<>();
for(String key:properties.keySet()){IndexMapping mapping_item=new IndexMapping();//字段名称mapping_item.setField_name(key);String json_str=String.valueOf(properties.get(key)._get());json_str=json_str.substring(json_str.indexOf("Property: ")+9);JSONObject property_json= JSONObject.parseObject(json_str);//字段类型mapping_item.setField_type(property_json.getString("type"));//自定义格式if(property_json.containsKey("format")){mapping_item.setField_format(property_json.getString("format"));}mappings.add(mapping_item);
}

4.向索引添加映射字段

http请求

PUT /索引名称/_mapping
{"properties": {"新增字段": {"type": "keyword"}}
}

JAVA  API

//JSONObject mappings 为要增加的映射内容,参考http请求,这里省略细节
PutMappingResponse response=esClient.indices().putMapping(new PutMappingRequest.Builder().index("索引名称").withJson(new StringReader(mappings.toString())).build());
// 响应状态
Boolean acknowledged = response.acknowledged();

5.删除索引

http请求

DELETE /索引名称

JAVA  API

DeleteIndexResponse response = esClient.indices().delete(builder -> builder.index("索引名称");
// 响应状态
Boolean acknowledged = response.acknowledged();

七、文档相关操作

1.添加文档

http请求

POST /索引名称/_doc/文档id
{"字段1": "内容","字段2": "内容"
}

JAVA  API

// 插入文档到索引
//JSONObject json为文档内容
IndexRequest<Object> request = new IndexRequest.Builder<>().index("索引名称").id(”文档id“).document(json).build();
IndexResponse response = esClient.index(request);

2.编辑文档

http请求

PUT /索引名称/_doc/文档id
{"要修改的字段1":"要修改的内容","要修改的字段2":"要修改的内容"
}

JAVA  API

//要修改的内容用Map组装
Map<String,Object> updateMap=new HashMap<>();
UpdateRequest<Object, Object> updateRequest = new UpdateRequest.Builder<>().index("索引名称").id(”文档id“).doc(updateMap).build();UpdateResponse<Object> updateResponse = esClient.update(updateRequest, Object.class);

3.根据id查询文档

http请求

GET /索引名称/_doc/文档id

JAVA  API

GetRequest getRequest = new GetRequest.Builder().index("索引名称").id(”文档id“).build();
GetResponse<Object> response = esClient.get(getRequest, Object.class);
if (response.found()) {return response.source();
} else {throw new MyException(ResultEnum.DATA_IS_EXIST.getCode(),"数据不存在");
}

4.删除文档

http请求

DELETE /索引名称/_doc/文档id

JAVA  API

//支持批量删除,String[] id_arr为要删除的文档id数组
List<BulkOperation> bulkOperations = new ArrayList<>();
for(int i=0;i<id_arr.length;i++){String del_id=id_arr[i];bulkOperations.add(new BulkOperation.Builder().delete(d -> d.id(del_id).index("索引名称")).build());
}
BulkResponse bulkResponse = esClient.bulk(e -> e.index("索引名称").operations(bulkOperations));

5.筛选文档

http请求

GET blog/_search
{"query": {"bool" : {//必须满足的条件"must" : [//精确匹配{"term" : { "字段名称" : "自动内容" }},//模糊查询{"query_string": {"default_field": "字段名称","query": "*模糊匹配内容*"}}],//排除的条件"must_not" : [//精确匹配{"term" : { "字段名称" : "自动内容" }},//模糊查询{"query_string": {"default_field": "字段名称","query": "*模糊匹配内容*"}}]}},//排序规则"sort": [{//根据评分排序"_score": {"order": "desc"}},{"字段名称": {"order": "desc"}}],//从第几条开始获取,从0开始"from":  0,//获取多少条"size":  10
}

JAVA  API

//queryJson是查询条件的json,参考http方式
SearchRequest searchRequest = new SearchRequest.Builder().index("索引名称").withJson(new StringReader(queryJson.toString())).build();
SearchResponse<Object> response = esClient.search(searchRequest,Object.class);
List<Hit<Object>> hits = response.hits().hits();
//不需要输出文档id的话可以不要
List<Map<String,Object>> data_list = hits.stream().map(p->{Map<String,Object> map=new HashMap<>();map.put("docoment_id",p.id());map.putAll((Map<String, Object>)p.source());return map;}).collect(Collectors.toList());
//data_list是数据list,
//符合条件的数据总数为(int)response.hits().total().value()

八、结合ingest attachment实现文档解析

1.安装ingest attachment插件

下载地址(版本号可根据对应的ElasticSearch版本号进行替换):

https://artifacts.elastic.co/downloads/elasticsearch-plugins/ingest-attachment/ingest-attachment-7.17.4.zip

安装方法:

切换至ElasticSearch根目录,执行

#linux
./bin/elasticsearch-plugin install file:///path/to/ingest-attachment-7.17.4.zip
#windows
./bin/elasticsearch-plugin install file:///C:/path/to/ingest-attachment-7.17.4.zip

重启ElasticSearch,定义文本抽取管道

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

attachment中指定要过滤的字段为content,所以写入Elasticsearch时需要将文档内容放在content字段,传入内容需为文档的base64编码。支持txt、word、Excel、PPT、PDF等文件格式。

2.文件转base64编码

// 文件路径
String filePath = "E:/xxx/xxx.pdf"; // 请替换为你的文件路径
// 读取文件字节
byte[] fileBytes = Files.readAllBytes(Paths.get(filePath)); // 读取文件内容
String base64_str = Base64.getEncoder().encodeToString(fileBytes); // 编码为Base64字符串

3.实现文档解析

/*** 模拟管道处理,仅模拟,不会真正插入文档*/
Map<String, Object> source = new HashMap<>();
source.put("content", "文档的base64编码");
SimulateResponse response = client.ingest().simulate(builder -> builder.id("my-pipeline").docs(documentBuilder -> documentBuilder.index("索引名称").id(”文档id“).source(JsonData.of(source))));
log.info("response={}", response);

4.在文档索引的过程中使用

Map<String, Object> source = new HashMap<>();
source.put("content", "文档的base64编码");
IndexRequest<Object> request = new IndexRequest.Builder<>().index("索引名称").id(”文档id“).document(JsonData.of(source)).pipeline("attachment").build();IndexResponse response = esClient.index(request);logger.info(response.toString());

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

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

相关文章

手机星选官,你的智能选机助手

手机星选官&#xff0c;你的智能选机助手 文章目录 手机星选官&#xff0c;你的智能选机助手1. 手机星选官计2. 手机星选官开发流程3. 智能体开发实践3.1 基础配置3.2 进阶配置3.3 高阶功能3.4 调优心得3.5可能会遇到的问题和解决办法 4. 文心智能体 1. 手机星选官计 “手机星…

从蹲在碎片前沉思到SpaceX“筷子回收”,马斯克用20年把梦想照进现实!

2006 年,一片荒芜的沙漠中,火箭残骸散落一地。伊隆马斯克蹲在爆炸后的碎片旁,眼中满是失望和沮丧。这个场景成为了 SpaceX 发展历程中的一个重要转折点。 SpaceX 的故事始于 2002 年,马斯克带着火星移民的梦想创立了这家公司。 早期的 SpaceX 面临着巨大的挑战。连续三次发射失…

岩石分类检测数据集 4700张 岩石检测 带标注 voc yolo 9类

岩石分类检测数据集 4700张 岩石检测 带标注 voc yolo 9类 岩石分类检测数据集 (Rock Classification and Detection Dataset) 描述: 本数据集旨在支持对不同类型的岩石进行自动分类和检测&#xff0c;特别适用于地质勘探、矿物识别、环境监测等领域。通过使用该数据集训练的模…

项目管理中,那些不应该存在的信息差

信息差&#xff0c;简单来说&#xff0c;就是项目团队成员之间、团队与外部利益相关者之间在信息获取、理解和传递上的不一致或偏差。 一、项目管理中常见的信息差类型 1、层级信息差&#xff1a;高层管理者与基层员工之间在信息获取上存在差异&#xff0c;高层可能缺乏一线执…

ubuntu22.04 安装wine9.0 全网首发

wine官网推荐安装方式&#xff1a;https://gitlab.winehq.org/wine/wine/-/wikis/zh_CN/Debian-Ubuntu 博主按照这种方式是失败的&#xff0c;虽然开启了“低调上网”&#xff0c;貌似代理对于终端不起作用&#xff0c;后面会介绍替代方案&#xff0c;一样完美。 一、官网的安…

Spirng事务的传播学习

事务传播&#xff1a;一个事务方法在被调用时&#xff0c;如何与现有事务的交互行为。当方法被事务性地调用时&#xff0c;他应该加入当前事务还是开启一个新事物。 常见的事务传播机制&#xff08;7种&#xff09;&#xff1a; Propagation枚举类&#xff0c;定义了传播机制…

运放基础知识

特点: 1.频带过窄 2.线性范围小 加入负反馈之后 1.拓展频带 2.减小非线性失真 优点: 高增益,输入电阻大,输出电阻小 运放的U,U-都是相对于大地来说的,有些图中可能不画出来,但是需要明白 同时正负电源输入一般也省略 虚短与虚断的理解 当Uo是有限值时,注意到Uo Au*(…

5G NR UE初始接入信令流程

文章目录 5G NR UE初始接入信令流程 5G NR UE初始接入信令流程 用户设备向gNB-DU发送RRCSetupRequest消息。gNB-DU 包含 RRC 消息&#xff0c;如果 UE 被接纳&#xff0c;则在 INITIAL UL RRC MESSAGE TRANSFER 消息中包括为 UE 分配的低层配置&#xff0c;并将其传输到 gNB-CU…

图解Redis 03 | List数据类型的原理及应用场景

介绍 List是一个简单的字符串列表&#xff0c;按照元素的插入顺序进行排序。您可以从头部或尾部添加元素到这个列表中。 列表的最大长度为2^32 - 1&#xff0c;即支持多达40亿个元素。 内部实现 List 类型的底层数据结构在 Redis 中可以采用双向链表或压缩列表(ziplist)&…

vue3之插件

插件plugins是一种能为vue添加全局功能的代码,官网连接&#xff1a;https://cn.vuejs.org/guide/reusability/plugins.html 项目的src文件夹下新建plugins文件夹 新建i18n.js文件 插件是一个拥有install方法的对象 export default {install: (app, options)>{app.config.…

基于SSM+Vue+MySQL的少儿编程网上报名系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当下&#xff0c;随着国家对教育的重视以及教育部门对教育改革的不断推进&#xff0c;少儿编程教育逐渐成为了一个热门领域。传统的少儿编程报名方式往往依赖于线下填写纸质表格或电话报名&#xff0c;这种方式不仅效率低下&a…

开发日志:IIS安全配置

为了解决IIS文件路径泄漏问题&#xff0c;可以采取以下措施&#xff1a; 一. 详细操作 1. CMD关闭NTFS 8.3文件格式的支持 命令行&#xff1a;fsutil 8dot3name set 1 2. 修改注册表禁用短文件名功能 CMD输入regedit回车&#xff0c;在注册表中找到HKEY_LOCAL_MACHINE\SYSTEM\C…

PHP政务招商系统——高效连接共筑发展蓝图

政务招商系统——高效连接&#xff0c;共筑发展蓝图 &#x1f3db;️ 一、政务招商系统&#xff1a;开启智慧招商新篇章 在当今经济全球化的背景下&#xff0c;政务招商成为了推动地方经济发展的重要引擎。而政务招商系统的出现&#xff0c;更是为这一进程注入了新的活力。它…

【Java】I/O 操作详解

&#x1f4c3;个人主页&#xff1a;island1314 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 目录 1. 引言 &#x1f680; 2. File 类 &#x1f4d5; 2.1 创建 File 对象 …

Golang | Leetcode Golang题解之第472题连接词

题目&#xff1a; 题解&#xff1a; type trie struct {children [26]*trieisEnd bool }func (root *trie) insert(word string) {node : rootfor _, ch : range word {ch - aif node.children[ch] nil {node.children[ch] &trie{}}node node.children[ch]}node.isE…

Qt-系统网络TCP回显客户端与服务端(65)

目录 描述 函数 使用 服务器 准备工作 声明相关函数与对象 绑定并监听 定义槽函数与连接 瑕疵 释放 客户端 准备工作 声明相关函数与对象 初始化并连接服务器 给发送添加槽函数 连接信号槽处理响应函数 测试运行 补充 代码 客户端 服务器 描述 有UDP&…

MySQL 删除数据库

1.使用命令行删除一个数据库 1.1 首先登陆进入 MySQL 操作界面&#xff0c;命令如下&#xff1a; 命令 : mysql -utest -p;1.2 登陆成功之后可以使用如下命令查看当前已有数据库&#xff1a; 命令 : SHOW DATABASES; 执行结果如下图: 如图所示当前已包含 MySQL 系统数据库和…

TensorRT-LLM七日谈 Day3

今天主要是结合理论进一步熟悉TensorRT-LLM的内容 从下面的分享可以看出&#xff0c;TensorRT-LLM是在TensorRT的基础上进行了进一步封装&#xff0c;提供拼batch&#xff0c;量化等推理加速实现方式。 下面的图片更好的展示了TensorRT-LLM的流程&#xff0c;包含权重转换&…

iPhone 16 Pro 拆解揭秘:设计改进与维修便利性

苹果最新推出的iPhone 16系列在许多方面都进行了更新和改进&#xff0c;而这次我们要聚焦的是其中的高端型号——iPhone 16 Pro。 这款手机不仅在性能上有所提升&#xff0c;在内部构造上也带来了不少变化&#xff0c;让我们一起来看看这些细节吧。 更容易进入的内部结构 对于…

一、Java基础

韩顺平Java基础 浮点型使用细节基本数据类型转换自动类型转换强制类型转换 浮点型使用细节 double d 8.1 / 3 的结果是一个非常接近2.7的小数&#xff0c;比如2.69999997&#xff0c;这是计算机的运算规则造成的 基本数据类型转换 自动类型转换 对于第四点&#xff0c;如下…