🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。
🍊支持作者: 点赞👍、关注💖、留言💌~
之前我们讲了如何在 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 配置文件之前启动就可以解决了。
🍓🍓通过代码 *** 作 ElasticSearch🍓🍓到这里 Spring Boot 已经整合好 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 也就讲完了,上面提到的 *** 作方式都是最简单的增、删、改、查,各位小伙伴可以将上面的代码拿到自己的环境中尝试一下,希望能帮助小伙伴们快速入门😊
本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇
希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●’◡’●)
如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。
你在被打击时,记起你的珍贵,抵抗恶意;
你在迷茫时,坚信你的珍贵,抛开蜚语;
爱你所爱 行你所行 听从你心 无问东西
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)