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年)

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

Dns_在Ubuntu和Centos上安装并配置Dns服务器

Dns_在Ubuntu和Centos上安装并配置Dns服务器 一、Ubuntu上安装Dns1.安装 BIND92.配置 DNS 服务器3.配置防火墙&#xff08;如果启用 UFW&#xff09;4.在客户端使用 DNS 服务器5.测试 DNS 服务器6.常见问题及解决方案 二、Centos上安装Dns 以下记录在Ubuntu和Centos系统上安装D…

软工毕设开题建议

文章目录 &#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;因为你可是第一次接触这么多卡…

聚合值和非聚合值比较【SQL】

文章目录 聚合值和非聚合值比较背景可以在HAVING中使用的聚合条件如何实现与非聚合值的比较与非聚合值的特殊比较 聚合值和非聚合值比较 背景 在数据库中&#xff0c;聚合值和非聚合值通常不直接比较&#xff0c;因为它们的上下文和用途不同。聚合值是通过聚合函数计算出来的…

linx ,centos7 ,hadoop集群登录时免密登录注意点以及步骤

linx ,centos7 ,hadoop集群登录时免密登录注意点以及步骤 SSH 免密登陆 1&#xff0c;在配置ssh免密登陆之前&#xff0c;将master克隆3份slaves出来&#xff0c;然后验证其ip是否和上面所述一致&#xff0c;并使用Xshell连接&#xff0c;这样我们可以得到额外的三台机器&…

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

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

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

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

ANSI C、ISO C、POSIX标准、GNU的含义

一、基本概念 ISO: International Organization for Standardization&#xff0c;国际标准组织 ANSI: American National Standards Institute&#xff0c;美国国家标准协会 GNU&#xff1a;GNUs Not Unix&#xff0c;为了实现自由开源目的一个基金会 POSIX: Portable Oper…

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 的最小公倍…

PDF工具类源码

PDF-Guru: PDF Guru Anki是一款以PDF为中心的多功能办公学习工具箱软件&#xff0c;包含四大板块功能&#xff1a;PDF实用工具箱、Anki制卡神器、Anki最强辅助、视频笔记神器&#xff0c;软件功能众多且强大&#xff0c;熟练运用可以大幅提高办公和学习效率&#xff0c;绝对是您…

在 MySQL 中,添加索引后,插入、更新和删除操作的性能通常会变慢的原因

在 MySQL 中&#xff0c;添加索引后&#xff0c;插入、更新和删除操作的性能通常会变慢。这是因为索引的存在增加了这些操作的复杂性和开销。 1. 索引维护成本 索引是一种数据结构&#xff0c;用于加速数据的查找。常见的索引类型包括 B-Tree 索引、哈希索引等。当插入、更新…

在文件里引用目录文件下的静态资源图片不显示

问题&#xff1a;两种图片路径的指定方式&#xff0c;第一种能展示图片但第二种不能 两个 示例中&#xff0c;图片展示的差异。 在第一个示例中&#xff0c;图片路径是硬编码在 标签的 src 属性中的&#xff1a; <img src"../../assets/img/header01.png" style…

线性可分支持向量机的原理推导 线性分隔超平面关于任意样本点 (x_i,y_i)的函数间隔 公式解析

本文是将文章《线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 公式 9-1 用来表达训练集样本点 ( x i , y i ) (\mathbf{x}_i, y_i) (xi​,yi​) 到线性可分支持向量机分离超平面的距离。 d ^ i y i ( w ⋅ x i b )…