irpas技术客

大聪明教你学Java | Spring Boot 整合 ElasticSearch 及其简单操作_不肯过江东丶_java 整合elasticsearch

未知 7781

前言

🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。 🍊支持作者: 点赞👍、关注💖、留言💌~

之前我们讲了如何在 Win 10环境下搭建一套属于自己的 ElasticSearch (大聪明教你学Java | Win10 环境下搭建 Elasticsearch)和 Elasticsearch 的核心概念与基础操作(大聪明教你学Java | Elasticsearch 的核心概念与基础操作)。相信各位小伙伴都对 ElasticSearch 有了一个基本的了解,那么今天咱们接着往下说,看看如何在 Spring Boot 种整合 Elasticsearch。

Spring Boot 整合 ElasticSearch 及其简单操作 🍓🍓Spring Boot 整合 ElasticSearch🍓🍓

其实 Spring Boot 整合 ElasticSearch 的步骤是很简单的,一共分为两步:

引入 Maven 依赖增加 ElasticSearch 的配置类

首先我们先看一下需要引入的 Maven 依赖👇

<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> </dependency>

接下来我们再新建一个 ElasticSearch 的配置类,用来连接 ElasticSearch 👇

import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.data.elasticsearch.config.ElasticsearchConfigurationSupport; import org.springframework.data.elasticsearch.core.ElasticsearchEntityMapper; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.data.elasticsearch.core.EntityMapper; import java.net.InetAddress; import java.net.UnknownHostException; /** * elasticsearch 配置类 * @program: elasticsearch * @description: Esconfig * @author: 庄霸.liziye * @create: 2022-04-13 14:32 **/ @Configuration public class Esconfig extends ElasticsearchConfigurationSupport { @Bean public Client elasticsearchClient() throws UnknownHostException { Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build(); TransportClient client = new PreBuiltTransportClient(settings); client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); return client; } @Bean(name = "elasticsearchTemplate") public ElasticsearchTemplate elasticsearchTemplate() throws UnknownHostException { return new ElasticsearchTemplate(elasticsearchClient(), entityMapper()); } @Bean @Override public EntityMapper entityMapper() { ElasticsearchEntityMapper entityMapper = new ElasticsearchEntityMapper(elasticsearchMappingContext(), new DefaultConversionService()); entityMapper.setConversions(elasticsearchCustomConversions()); return entityMapper; } }

??这里有三点是需要注意的:

我们可以看到配置文件中使用的端口是9300而不是9200。9200端口是 ElasticSearch 节点与外部通讯使用的端口。它是 http 协议的 RESTful 接口(各种CRUD操作都是走的该端口,例如查询:http://localhost:9200/user/_search);9300端口是 ElasticSearch 节点之间通讯使用的端口。它是 tcp 通讯端口,集群间和 TCPclient 都走的此端口,所以 Java 程序中使用 ElasticSearch 时,在配置文件中要使用 9300 端口。Spring Boot 版本号和 ElasticSearch 版本号是有对应关系的,如果版本对应有误,则可能导致无法正常启动项目的。(本人使用的 Spring Boot 版本是 2.2.4.RELEASE,ElasticSearch 版本是6.2.2。具体版本号对应关系如下图所示~)如果项目中引入了 spring-boot-starter-data-redis 依赖,则会导致项目启动报错。问题原因是 Redis 和 ElasticSearch 之间发生了冲突,解决办法也很简单:修改 Redis 配置文件和 ElasticSearch 配置文件的自动装配的顺序,通过 @AutoConfigureBefore 注解让 ElasticSearch 配置文件在 Redis 配置文件之前启动就可以解决了。

到这里 Spring Boot 已经整合好 ElasticSearch 了。在整合过程中,我们一定要注意上面提到的三个“坑”,只要规避了上面的三个问题,整合起来还是挺简单的😊 下面我们再看看如何通过代码去操作 ElasticSearch💪

🍓🍓通过代码操作 ElasticSearch🍓🍓

其实通过代码操作 ElasticSearch 也是挺简单的(毕竟是简单操作嘛😂),这里就不多说了,直接上代码👇

🍋代码背景: 我们在开发应用系统时,经常会需要记录账号的登录日志,随着日志数量的增加,使用传统的检索方式对日志信息检索耗时会比较长,那么我们就用 ElasticSearch 来简单的操作一下登录日志信息~

🍎新建登录信息实体类🍎

package com.example.elasticsearch.demo; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; /** * 登录信息实体类 * @description: LoginInfo * @author: 庄霸.liziye * @create: 2022-04-13 14:34 * login:索引库名 * info:类型 **/ @Document(indexName = "login",type = "info") public class LoginInfo { /** * 用户id */ private String id; /** * 登录名 */ private String name; /** * 登录密码 */ private String pwd; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "LoginInfo{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } }

🍎实现索引对应的Repository🍎

/** * @description: LoginInfoRepository * @author: 庄霸.liziye * @create: 2022-04-13 14:35 **/ import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; public interface LoginInfoRepository extends ElasticsearchRepository<LoginInfo, String> { }

🍎新建 Controller 操作 ElasticSearch🍎

import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryStringQueryBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Iterator; /** * @program: elasticsearch * @description: EsController * @author: 庄霸.liziye * @create: 2022-04-13 14:36 **/ @RestController public class EsController { @Autowired LoginInfoRepository pository; /** * 通过关键词检索 */ @RequestMapping("/searchByKey") public String findall(){ //全文检索关键字 String queryString = "张三"; QueryStringQueryBuilder builder = new QueryStringQueryBuilder(queryString); Iterable<LoginInfo> mod = pository.search(builder); Iterator iterator = mod.iterator(); String result = ""; while(iterator.hasNext()){ Object str = (Object) iterator.next(); LoginInfo loginInfo = (LoginInfo)str; System.out.println("loginInfo = " + loginInfo); result += loginInfo + " "; } return result; } /** * 插入信息 */ @RequestMapping("/saveInfo") public String save() { LoginInfo loginInfo1 = new LoginInfo(); loginInfo1.setId("1"); loginInfo1.setName("张三"); loginInfo1.setPwd("123456"); pository.save(loginInfo1); LoginInfo loginInfo2 = new LoginInfo(); loginInfo1.setId("2"); loginInfo1.setName("王五"); loginInfo1.setPwd("67890"); pository.save(loginInfo1); return "保存成功"; } /** * 更新信息 */ @RequestMapping("/updateInfo") public String update() { LoginInfo loginInfo = new LoginInfo(); loginInfo.setId("1"); loginInfo.setName("李四"); loginInfo.setPwd("123456"); LoginInfo index = pository.save(loginInfo); return "修改成功"; } /** * 删除信息 */ @RequestMapping("/deleteInfo") public String delete() { LoginInfo loginInfo = new LoginInfo(); loginInfo.setId("1"); loginInfo.setName("李四"); loginInfo.setPwd("123456"); pository.delete(loginInfo); return "删除成功"; } }

接下来我们启动项目,通过浏览器访问对应的方法,看看代码的执行效果如何👇

🍋插入信息🍋

① 访问 http://localhost/es/saveInfo 执行插入信息的方法

② 我们通过 kibana 去查询一下,看看数据是不是被成功的插入进了索引中

🍋按关键字搜索信息🍋

① 访问 http://localhost/es/searchByKey 按“张三”关键字对数据进行查找

🍋更新信息🍋

① 访问 http://localhost/es/updateInfo 对数据进行更新

② 我们通过 kibana 去验证一下,看看 id 为1的数据中用户名是不是变为了李四

🍋删除信息🍋

① 访问 http://localhost/es/deleteInfo 对数据进行删除

② 我们通过 kibana 去验证一下,看看数据是不是被成功删除了

到这里,关于用 Java 代码操作 ElasticSearch 也就讲完了,上面提到的操作方式都是最简单的增、删、改、查,各位小伙伴可以将上面的代码拿到自己的环境中尝试一下,希望能帮助小伙伴们快速入门😊

小结

本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇?

希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (????) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●’?’●)

如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。

你在被打击时,记起你的珍贵,抵抗恶意; 你在迷茫时,坚信你的珍贵,抛开蜚语; 爱你所爱 行你所行 听从你心 无问东西


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #JAVA #整合elasticsearch #之前我们讲了如何在 #Win #10环境下搭建一套属于自己的 #ElasticSearch #