Springboot整合原生ES依赖

前言

Springboot整合依赖大概有三种方式:

  • es原生依赖:elasticsearch-rest-high-level-client
  • Spring Data Elasticsearch
  • Easy-es

三者的区别

1. Elasticsearch Rest High Level Client

简介:

  • 这是官方提供的 Elasticsearch 客户端,支持 Java 应用程序与 Elasticsearch 集群进行通信。

特点:

  • 低级别 API: 提供对 Elasticsearch 的低级别 REST API 封装,允许开发者直接使用 Elasticsearch 的所有功能。
  • 灵活性: 可以执行所有 Elasticsearch 支持的操作,如索引、搜索、更新和删除等。
  • 直接的控制: 开发者可以手动构造请求和处理响应,提供了更大的控制权。
  • 与 Elasticsearch 版本保持同步: 由于是官方客户端,可以更好地与 Elasticsearch 版本进行兼容。

使用场景:

  • 适合需要精细控制和高灵活性的应用,特别是在处理复杂的查询或需要使用 Elasticsearch 的高级特性时。

2. Spring Data Elasticsearch

简介:

  • 这是 Spring 生态系统中的一部分,旨在简化使用 Elasticsearch 的过程,提供了更高层次的抽象。

特点:

  • 集成 Spring: 提供与 Spring 框架的无缝集成,支持依赖注入、配置和自动化管理。
  • Repository 模式: 使用类似于 Spring Data JPA 的 Repository 接口,可以更方便地执行 CRUD 操作和查询。
  • 实体映射: 支持将 Java 对象直接映射到 Elasticsearch 文档,简化了数据的处理。
  • 注解支持: 通过注解定义索引、字段和查询,减少了样板代码。

使用场景:

  • 适合已经在使用 Spring 的应用程序,特别是希望快速实现与 Elasticsearch 的集成,同时享受 Spring 提供的便利。

3. Easy-ES

简介:

  • Easy-ES 是一个第三方的 Java 客户端库,旨在简化 Elasticsearch 的操作,提供更为便捷的 API。

特点:

  • 简化 API: 封装了 Elasticsearch 的复杂性,使得操作更简单易用,尤其是在批量操作和查询时。
  • 注解驱动: 提供了注解来配置索引和字段,使得使用更加直观。
  • 支持多种数据源: 除了支持 Elasticsearch 外,还能与其他数据源进行集成。
  • 灵活配置: 提供了多种配置选项,方便用户定制化。

使用场景:

  • 适合需要简化 Elasticsearch 操作的开发者,特别是在处理简单应用或快速开发时,能够提高开发效率。

总结

  • Elasticsearch Rest High Level Client: 提供全面的 API 访问,适合需要直接控制和高灵活性的场景。
  • Spring Data Elasticsearch: 适合与 Spring 应用集成,简化数据访问的同时保持 Spring 风格。
  • Easy-ES: 更加简化的 API,适合快速开发和简单应用,特别适合对 Elasticsearch 操作不太熟悉的开发者。

Elasticsearch Rest High Level Client整合

1、添加依赖

 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.3.2</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.3.2</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.3.2</version></dependency><!-- ...其他依赖省略 具体可以才看源码 -->

2、属性类添加

EsProperties

主要用于读取yaml文件的配置

package com.walker.es.properites;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@ConfigurationProperties(prefix = "es")
@Component
@Data
public class EsProperties {private String host;private Integer port;private String scheme;private EsSecurityProperites security;
}
package com.walker.es.properites;import lombok.Data;@Data
public class EsSecurityProperites {private String username;private String password;private boolean enable;
}

3、application.yaml配置添加

根据自己的es配置进行修改,

这里添加了账号密码配置,一般来说,配置一下安全一些,否则容易被攻击

es:host: localhostport: 19200scheme: http
#  配置账号密码security:enable: trueusername: elasticpassword: elastic

4、ES配置类

主要用于创建RestHighLevelClient类,该类是es的客户端工具类,方法都集成在该类中

package com.walker.es.config;import com.walker.es.properites.EsProperties;
import com.walker.es.properites.EsSecurityProperites;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Slf4j
@Configuration
public class EsConfig {@Autowiredprivate EsProperties esProperties;//    注入restHighLevelClient到bean中@Beanpublic RestHighLevelClient restHighLevelClient(){//        构建es客户端RestClientBuilder builder = RestClient.builder( new HttpHost(esProperties.getHost(),esProperties.getPort(), esProperties.getScheme()));// 是否需要开启账号密码验证EsSecurityProperites security = esProperties.getSecurity();if(security!=null&&security.isEnable()){log.info("es~开启账号密码验证!");BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(security.getUsername(), security.getPassword()));builder.setHttpClientConfigCallback(httpClientBuilder ->httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));}log.info("构建RestHighLevelClient:{}",esProperties);return new RestHighLevelClient(builder);}
}

5、测试验证

实体类

package com.walker.es.model;import lombok.Data;@Data
public class AlarmRecordEntity {
//    事件private String title;
//    设备private String deviceCode;
//    时间private String time;//    索引名称public static String getIndex(){return "alarms";}}

controller类

主要有下面的接口方法

创建索引
  • 直接执行新增client.index(indexRequest, RequestOptions.DEFAULT); 也可以创建索引,但是直接创建的索引,字段的配置就都是默认的,例如我们如果需要使用中文分词器,就需要重新创建索引,这个在生产环境来说是比较麻烦的,需要迁移数据
  • 索引可以单独写一个接口去创建索引,指定好字段的属性。
@PostMapping("/createIndex")public String createIndex() {CreateIndexRequest request = new CreateIndexRequest(AlarmRecordEntity.getIndex());//        设置别名request.alias(new Alias("alias_alarm"));// 设置索引的设置(可选)request.settings(Settings.builder().put("number_of_shards", 3)  // 分片数量.put("number_of_replicas", 2) // 副本数量.put("analysis.tokenizer.ik_max_word.type", "ik_max_word") // 使用 ik_max_word 分词器);// 使用 HashMap 创建映射Map<String, Object> properties = new HashMap<>();Map<String, Object> titleField = new HashMap<>();titleField.put("type", "text");titleField.put("analyzer", "ik_max_word"); // 配置中文分词器properties.put("title", titleField);Map<String, Object> deviceCodeField = new HashMap<>();deviceCodeField.put("type", "keyword");properties.put("deviceCode", deviceCodeField);Map<String, Object> timeField = new HashMap<>();timeField.put("type", "date");properties.put("time", timeField);// 设置映射HashMap<String, Object> map = new HashMap<>();map.put("properties", properties);request.mapping(map);try {client.indices().create(request, RequestOptions.DEFAULT);return "Index created successfully";} catch (IOException e) {e.printStackTrace();return "Error creating index: " + e.getMessage();}}

调用后:

在kibana中可以看到

  • 可以看到分片,副本等数量,以及存储的大小、别名等

  • 别名的作用也是很大的,如果后面索引太大,然后使用日期等配置索引的时候,就有作用了

  • mapping 映射 字段的类型,以及分词器

es的字段类型主要有以下这些:

1. 基本数据类型
String: 以前用于文本和关键词。现在使用以下两种类型替代:text: 用于全文搜索,支持分词。
keyword: 用于精确匹配,不支持分词,适合用于过滤、排序和聚合。
Numeric Types:integer: 整数类型(32位)。
long: 长整数类型(64位)。
float: 单精度浮点数(32位)。
double: 双精度浮点数(64位)。
short: 短整型(16位)。
byte: 字节类型(8位)。
Date: 日期类型,支持多种日期格式。2. 布尔类型
boolean: 布尔类型,只能取值 truefalse3. 复杂数据类型
Object: 嵌套的 JSON 对象,可以包含其他字段。Nested: 嵌套对象,支持对嵌套文档的查询,保持对象之间的关联性。4. 特殊类型
geo_point: 地理坐标类型,存储经纬度信息。geo_shape: 用于存储复杂的地理形状数据(如多边形等)。ip: 存储 IP 地址。5. 二进制类型
binary: 存储二进制数据,支持 Base64 编码的内容。
6. 列表类型
Elasticsearch 也支持字段的数组形式,可以将多个值存储在同一个字段中
增加单条记录
// 增加单条报警记录@PostMapping("/createAlarm")public String createAlarm(@RequestBody AlarmRecordEntity alarmRecord) throws IOException {IndexRequest indexRequest = new IndexRequest(AlarmRecordEntity.getIndex()).source("title", alarmRecord.getTitle(),"deviceCode", alarmRecord.getDeviceCode(),"time", alarmRecord.getTime());
//        创建单条数据 使用indexclient.index(indexRequest, RequestOptions.DEFAULT);return "Alarm record created";}
  • 使用index增加单条数据
  • 如果使用执行该index的时候,索引不存在,则会自己创建索引,例如将index改为alarms222,则可以看到执行的结果

但是他的配置使用的都是默认的

批量增加
    // 批量增加报警记录@PostMapping("/bulk")public String bulkCreateAlarms(@RequestBody List<AlarmRecordEntity> alarmRecords) throws IOException {//        批量增加数据 使用bulk方法BulkRequest bulkRequest = new BulkRequest();for (AlarmRecordEntity alarmRecord : alarmRecords) {IndexRequest indexRequest = new IndexRequest(AlarmRecordEntity.getIndex()).source("title", alarmRecord.getTitle(),"deviceCode", alarmRecord.getDeviceCode(),"time", alarmRecord.getTime());bulkRequest.add(indexRequest);}BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);if (bulkResponse.hasFailures()) {return "Failed to create some alarm records: " + bulkResponse.buildFailureMessage();}return "Batch alarm records created successfully";}

使用bulk插入多条数据

至于修改、删除、查询单个记录等,便不在多说,可以查看源码并进行调用

搜索
@PostMapping("/search")public ResponseEntity<List<AlarmRecordEntity>> searchAlarms(@RequestBody AlarmSearchRequest request) {try {// 创建搜索请求SearchRequest searchRequest = new SearchRequest(AlarmRecordEntity.getIndex());SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 分词查询if (StrUtil.isNotBlank(request.getTitle())) {sourceBuilder.query(QueryBuilders.matchQuery("title", request.getTitle()));}//            精确查询if(StrUtil.isNotBlank(request.getDeviceCode()))  {sourceBuilder.query(QueryBuilders.termQuery("deviceCode", request.getDeviceCode()));}// 时间范围查询(假设时间字段是一个日期格式)if (StrUtil.isNotBlank(request.getStartTime())) {sourceBuilder.query(QueryBuilders.rangeQuery("time").gte(request.getStartTime()).lte(request.getEndTime()));}// 将构建好的查询条件放入搜索请求中searchRequest.source(sourceBuilder);// 执行搜索SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析搜索结果List<AlarmRecordEntity> alarms = new ArrayList<>();response.getHits().forEach(hit -> {AlarmRecordEntity alarm = new AlarmRecordEntity();alarm.setTitle((String) hit.getSourceAsMap().get("title"));alarm.setDeviceCode((String) hit.getSourceAsMap().get("deviceCode"));alarm.setTime((String) hit.getSourceAsMap().get("time"));alarms.add(alarm);});return ResponseEntity.ok(alarms); // 返回 200 状态和报警记录列表} catch (Exception e) {return ResponseEntity.status(500).body(null); // 返回 500 状态和错误信息}}
  • 验证一下是否会分词

请求参数

{"title": "打架"
}

搜索结果

  • deviceCode精确查询
{"title": "","deviceCode": "A001","startTime": "","endTime": ""
}

返回结果:

  • 时间范围
{"title": "","deviceCode": "","startTime": "2024-10-20","endTime": "2024-10-25"
}

返回结果:

总结

大概先做这些演示,不过在实际的过程中,使用原生的es依赖可能也不是最优选,因为会有很多字段需要手打,而不是直接方法获取

所以后面会演示使用spring封装的es依赖,以及easy-es的整合,敬请期待!

源码

https://gitee.com/shen-chuhao/walker_open_java.git

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

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

相关文章

小问题解决方法汇总(2024.10.24水个勋章)

问题1&#xff1a;”因为在系统上禁止运行脚本“ 我们在使用命令行时经常遇到类似文章这样的提示&#xff0c;或者是如下截图中显示的那样&#xff1a; 仅需要在“管理员权限下的Powershell”中输入下面的命令即可解决&#xff1a; set-ExecutionPolicy RemoteSigned 输入命…

【数据分享】全国科技-产品质量国家监督抽查(1995-2021年)

数据介绍 一级标题指标名称单位科技国家监督抽查产品种类种科技国家监督抽查食品种类种科技国家监督抽查日用消费品种类种科技国家监督抽查建筑与装饰装修材料种类种科技国家监督抽查农业生产资料种类种科技国家监督抽查工业生产资料种类种科技国家监督抽查企业家科技国家监督抽…

软工毕设开题建议

文章目录 &#x1f6a9; 1 前言1.1 选题注意事项1.1.1 难度怎么把控&#xff1f;1.1.2 题目名称怎么取&#xff1f; 1.2 开题选题推荐1.2.1 起因1.2.2 核心- 如何避坑(重中之重)1.2.3 怎么办呢&#xff1f; &#x1f6a9;2 选题概览&#x1f6a9; 3 项目概览题目1 : 深度学习社…

一文讲明白大模型分布式逻辑(从GPU通信原语到Megatron、Deepspeed)

1. 背景介绍 如果你拿到了两台8卡A100的机器&#xff08;做梦&#xff09;&#xff0c;你的导师让你学习部署并且训练不同尺寸的大模型&#xff0c;并且写一个说明文档。你意识到&#xff0c;你最需要学习的就是关于分布式训练的知识&#xff0c;因为你可是第一次接触这么多卡…

【数据仓库】数据仓库面试题

简单整理了一下题目和答案&#xff0c;希望对大家有所帮助。 第一面&#xff1a;基础技术与概念 什么是ETL&#xff1f;请解释ETL过程中的每个步骤。 ETL是Extract, Transform, Load的缩写&#xff0c;用于描述将数据从源系统提取、转换为适合分析的形式、最后加载到目标系统的…

使用vscode拉取release远程分支,发现没有这个分支,但是远程仓库里确确实实有,是因为没有及时更新远程仓库分支导致

今天在开发过程中&#xff0c;需要从release分支上拉取代码重新拉个分支开发&#xff0c;方便后面迭代更新。但是我在vscode里点击分支&#xff0c;发现没有远程分支release/v1.0.0&#xff0c;但是仓库里确确实实有这个分支。然后我就上网查有类似的情况&#xff0c;参考别人是…

74页PPT智能工厂整体规划方案

▲关注智慧方案文库&#xff0c;学习9000多份最新解决方案&#xff0c;其中 PPT、WORD超过7000多份 &#xff0c;覆盖智慧城市多数领域的深度知识社区&#xff0c;稳定更新4年&#xff0c;日积月累&#xff0c;更懂行业需求。 智能工厂的定义 根据《智能工厂通用技术要求》的…

【个人记录】新电脑的配置截图和电源选项的修改

核心硬件评测&#xff1a; 硬件参数&#xff1a; #修改的电源设置# 电源选项-编辑计划设置-修改的设置&#xff1a; 电源选项-关闭盖子时-修改的设置&#xff1a;

MapStruct浅尝

<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://ma…

一文掌握异步web框架FastAPI(七)-- 安全(XSS 和 CSRF 防护、权限和角色控制、审计日志、使用安全的随机数生成、API 文档保护、会话管理)

接上篇:一文掌握异步web框架FastAPI(六)-- 安全(HTTP验证、Bearer Token、Session、OAuth2 和 OpenID Connect、HTTPS 和 TLS、速率限制)-CSDN博客 目录 九、安全 7、XSS 和 CSRF 防护 1)XSS防护 2)CSRF防护 8、安全的数据存储 9、环境变量管理 10、权限和角色控…

Redis 命令集 (超级详细)

目录 Redis 常用命令集 string类型 hash类型 list类型 set类型 zset类型 bitmap 类型 geo 类型 GEOADD (添加地理位置的坐标) GEOPOS (获取地理位置的坐标) GEODIST (计算两个位置之间的距离) GEOHASH (返回一个或多个位置对象的 geohash 值) GEORADIUS (根据用户…

LeetCode_2413. 最小偶倍数_java

1、问题 2413. 最小偶倍数https://leetcode.cn/problems/smallest-even-multiple/给你一个正整数 n &#xff0c;返回 2 和 n 的最小公倍数&#xff08;正整数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;n 5 输出&#xff1a;10 解释&#xff1a;5 和 2 的最小公倍…

【学习笔记】网络设备(华为交换机)基础知识 9 —— 堆叠配置

提示&#xff1a;学习华为交换机堆叠配置&#xff0c;含堆叠的概念、功能、角色、ID和优先级&#xff1b;堆叠的建立过程以及注意事项&#xff1b;包含堆叠的配置命令&#xff0c;以及堆叠的配置案例 一、前期准备 1.已经可以正常访问交换机的命令行接口 Console口本地访问教…

解码专业术语——应用系统开发项目中的专业词汇解读

文章目录 引言站点设置管理具体要求包括&#xff1a; Footer管理基于URL的权限控制利用数据连接池优化数据库操作什么是数据连接池&#xff1f;优化的优势 利用反射改造后端代码&#xff0c;AJAX反射的作用及其在后端代码中的应用AJAX 实现前后端无刷新交互 引言 创新实践项目二…

『完整代码』按钮开关UI界面

创建按钮Button 作为开关坐骑UI界面的按钮 创建Image 作为坐骑UI界面 在父类脚本添加其中函数即可 绑定脚本在父类窗口对象 在按钮上响应事件 隐藏UI界面 运行项目 - 实现点击按钮开关UI界面 再次点击按钮 - 关闭UI界面 end

想让前后端交互更轻松?alovajs了解一下?

作为一个前端开发者&#xff0c;我最近发现了一个超赞的请求库 alovajs&#xff0c;它真的让我眼前一亮&#xff01;说实话&#xff0c;我感觉自己找到了前端开发的新大陆。大家知道&#xff0c;在前端开发中&#xff0c;处理 Client-Server 交互一直是个老大难的问题&#xff…

【C++训练营】现代C++编程(隐藏)

一、面向对象的特性 1.1 编码规范 1.1.1 效率 时间/空间&#xff1a;计算相关逻辑的时间复杂度和空间复杂度内存&#xff1a;考虑内存占用和cache命中率堆/栈&#xff1a;从生存周期、内存管理复杂性、对象大小等角度来考虑堆栈应用存储&#xff1a;考虑存储护具方式和读取方…

使用docker-compose搭建redis7集群-3主3从

下面是一个用于搭建 Redis 集群的 docker-compose.yml 示例文件&#xff0c;它会启动 6 个 Redis 节点&#xff08;3 主节点 3 从节点&#xff09;来构成一个最小的 Redis 集群。 同一个容器内网通讯没问题&#xff0c;但是你要是需要暴露到外网你需要用第二个yml 内网的 v…

信雅纳Chimera 100G网络损伤仪助力Parallel Wireless开展5G RAN无线前传网络的损伤模拟

背景介绍 Parallel Wireless 为移动运营商提供唯一全覆盖的(5G/4G/3G/2G&#xff09;软件支持的本地 OpenRAN (ORAN) 解决方案。该公司与全球 50 多家领先运营商合作&#xff0c;并被 Telefonica 和 Vodafone 评为表现最佳的供应商。Parallel Wireless 在多技术、开放式虚拟化…

从头学PHP之运算符

关于运算符的图片均来自网络&#xff0c;主要是自己写太麻烦了&#xff0c;程序是个简化自己工作量的方式&#xff0c;能复制粘贴就不要手写了&#xff08;建议初期还是多写写&#xff0c;加深下记忆&#xff09;在这里我就偷个懒&#xff0c;图片涉及到侵权及时&#xff0c;请…