Spring Boot整合ElasticSearch和Mysql 附案例源码
Posted 陈彦斌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot整合ElasticSearch和Mysql 附案例源码相关的知识,希望对你有一定的参考价值。
导读
前二天,写了一篇ElasticSearch7.8.1从入门到精通的(点我直达),但是还没有整合到SpringBoot中,下面演示将ElasticSearch和mysql整合到Spring Boot中,附演示源码。
项目介绍
模仿NBA网站
网址地址:点我直达
接口开发
- 将数据库数据导入到ElasticSearch
- 通过姓名查找球员
- 通过国家或者球队查询球员
- 通过姓名字母查找球员
项目搭建
SpringBoot整合ElasticSearch和Mysql
数据库数据
将百度云盘里的sql,在mysql上运行即可
链接: https://pan.baidu.com/s/1MJaJy8isfVnPha00tlS8_w 密码: u3dg
项目结构
pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.cyb</groupId> <artifactId>yb_search</artifactId> <version>0.0.1-SNAPSHOT</version> <name>yb_search</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--ElasticSearch相关开始--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.8.1</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.8.1</version> </dependency> <!--ElasticSearch相关结束--> <!--fastjson相关开始--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.73</version> </dependency> <!--fastjson相关结束--> <!--druid相关开始--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.23</version> </dependency> <!--druid相关结束--> <!--mybatis与springboot兼容包相关开始--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> <!--mybatis与springboot兼容包相关结束--> <!--mysql相关开始--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> <!--mysql相关结束--> <!--commons-lang3相关开始--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.11</version> </dependency> <!--commons-lang3相关结束--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <!-- <exclusions>--> <!-- <exclusion>--> <!-- <groupId>org.junit.vintage</groupId>--> <!-- <artifactId>junit-vintage-engine</artifactId>--> <!-- </exclusion>--> <!-- </exclusions>--> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
注意
我本地安装的ElasticSearch版本是7.8.1,引入pom的ES依赖的话,最好版本一致,否则可能出现版本兼容问题!!!!!!!!!!!
application.properties
# 端口号 server.port=8083 # 数据库配置 spring.datasource.url=jdbc:mysql://localhost:3306/nba?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root # 连接池 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 表明使用Druid连接池 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource #初始化时建立物理连接的个数。 spring.datasource.druid.initial-size=5 #最大连接池数量 spring.datasource.druid.max-active=20 #最小连接池数量 spring.datasource.druid.min-idle=5 #获取连接时最大等待时间,单位毫秒 spring.datasource.druid.max-wait=3000 #是否缓存preparedStatement,也就是PSCache,PSCache对支持游标的数据库性能提升巨大,比如说oracle,在mysql下建议关闭。 spring.datasource.druid.pool-prepared-statements=false #要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 spring.datasource.druid.max-open-prepared-statements= -1 #配置检测可以关闭的空闲连接间隔时间 spring.datasource.druid.time-between-eviction-runs-millis=60000 # 配置连接在池中的最小生存时间 spring.datasource.druid.min-evictable-idle-time-millis= 300000 spring.datasource.druid.max-evictable-idle-time-millis= 400000 # 日志相关 logging.level.root: info logging.level.com.cyb.search: debug # ElasticSearch配置 elasticsearch.host:192.168.199.170 elasticsearch.port=9200
EsConfig.java(ES配置类)
package com.cyb.search.config; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @ClassName:EsConfig * @Description:ES配置文件 * @Author:chenyb * @Date:2020/8/10 11:25 下午 * @Versiion:1.0 */ @Configuration //获取application.properties或application.yml获取里面的参数值 @ConfigurationProperties(prefix = "elasticsearch") public class EsConfig { private String host; private Integer port; //初始化RestHighLevelClient @Bean(destroyMethod = "close") public RestHighLevelClient client(){ return new RestHighLevelClient(RestClient.builder( new HttpHost(host,port,"http") )); } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public Integer getPort() { return port; } public void setPort(Integer port) { this.port = port; } }
NBAPlayerDao.java
package com.cyb.search.dao; import com.cyb.search.model.NBAPlayer; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import java.util.List; @Mapper public interface NBAPlayerDao { @Select("select * from nba_player") List<NBAPlayer> selectAll(); }
NBAPlayer.java(实体类)
package com.cyb.search.model; /** * @ClassName:NBAPlayer * @Description:TODO * @Author:chenyb * @Date:2020/8/10 11:39 下午 * @Versiion:1.0 */ public class NBAPlayer { private Integer id; private String countryEn; private String country; private String code; private String displayAffiliation; private String displayName; private Integer draft; private String schoolType; private String weight; private Integer playYear; private String jerseyNo; private Long birthDay; private String birthDayStr; private String displayNameEn; private String position; private Double heightValue; private String playerId; private String teamCity; private String teamCityEn; private String teamName; private String teamNameEn; private String teamConference; private String teamConferenceEn; private Integer age; public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getBirthDayStr() { return birthDayStr; } public void setBirthDayStr(String birthDayStr) { this.birthDayStr = birthDayStr; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getDisplayAffiliation() { return displayAffiliation; } public void setDisplayAffiliation(String displayAffiliation) { this.displayAffiliation = displayAffiliation; } public String getDisplayName() { return displayName; } public void setDisplayName(String displayName) { this.displayName = displayName; } public Integer getDraft() { return draft; } public void setDraft(Integer draft) { this.draft = draft; } public String getSchoolType() { return schoolType; } public void setSchoolType(String schoolType) { this.schoolType = schoolType; } public String getWeight() { return weight; } public void setWeight(String weight) { this.weight = weight; } public Integer getPlayYear() { return playYear; } public void setPlayYear(Integer playYear) { this.playYear = playYear; } public String getCountryEn() { return countryEn; } public void setCountryEn(String countryEn) { this.countryEn = countryEn; } public String getTeamCityEn() { return teamCityEn; } public void setTeamCityEn(String teamCityEn) { this.teamCityEn = teamCityEn; } public String getTeamNameEn() { return teamNameEn; } public void setTeamNameEn(String teamNameEn) { this.teamNameEn = teamNameEn; } public String getTeamConference() { return teamConference; } public void setTeamConference(String teamConference) { this.teamConference = teamConference; } public String getTeamConferenceEn() { return teamConferenceEn; } public void setTeamConferenceEn(String teamConferenceEn) { this.teamConferenceEn = teamConferenceEn; } public String getJerseyNo() { return jerseyNo; } public void setJerseyNo(String jerseyNo) { this.jerseyNo = jerseyNo; } public Long getBirthDay() { return birthDay; } public void setBirthDay(Long birthDay) { this.birthDay = birthDay; } public String getDisplayNameEn() { return displayNameEn; } public void setDisplayNameEn(String displayNameEn) { this.displayNameEn = displayNameEn; } public String getPosition() { return position; } public void setPosition(String position) { this.position = position; } public Double getHeightValue() { return heightValue; } public void setHeightValue(Double heightValue) { this.heightValue = heightValue; } public String getPlayerId() { return playerId; } public void setPlayerId(String playerId) { this.playerId = playerId; } public String getTeamCity() { return teamCity; } public void setTeamCity(String teamCity) { this.teamCity = teamCity; } public String getTeamName() { return teamName; } public void setTeamName(String teamName) { this.teamName = teamName; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } }
NBAPlayerService.java(接口)
package com.cyb.search.service; import com.cyb.search.model.NBAPlayer; import java.io.IOException; public interface NBAPlayerService { boolean addPlayer(NBAPlayer player,String id) throws IOException; }
NBAPlayerServiceImpl.java
package com.cyb.search.service.impl; import com.alibaba.fastjson.JSONObject; import com.cyb.search.model.NBAPlayer; import com.cyb.search.service.NBAPlayerService; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.cglib.beans.BeanMap; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** * @ClassName:NBAPlayerServiceImpl * @Description:TODO * @Author:chenyb * @Date:2020/8/11 10:09 下午 * @Versiion:1.0 */ @Service public class NBAPlayerServiceImpl implements NBAPlayerService { @Resource private RestHighLevelClient client; /** * 添加 * @param player 实体类 * @param id 编号 * @return * @throws IOException */ @Override public boolean addPlayer(NBAPlayer player, String id) throws IOException { IndexRequest request=new IndexRequest("nba_latest").id(id).source(beanToMap(player)); IndexResponse response = client.index(request, RequestOptions.DEFAULT); System.out.println(JSONObject.toJSON(response)); return false; } /** * 对象转map * @param bean * @param <T> * @return */ public static <T> Map<String,Object> beanToMap(T bean){ Map<String,Object> map=new HashMap<>(); if (bean!=null){ BeanMap beanMap=BeanMap.create(bean); for(Object key:beanMap.keySet()){ if (beanMap.get(key)!=null){ map.put(key+"",beanMap.get(key)); } } } return map; } }
基础功能实现
往ES中插入一条数据
查看数据库数据
根据ID查ES
单元测试
修改
单元测试
删除
单元测试
将数据库中的数据导入ES
通过名字查找球员
测试
通过国家或球队查找球员
测试
通过字母查球员
测试
项目源码下载
链接: https://pan.baidu.com/s/1QJ8wvjg7TPqGSP-68qpSIQ 密码: d26m
以上是关于Spring Boot整合ElasticSearch和Mysql 附案例源码的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot:Spring Boot整合Mybatis案例
Spring Boot:Spring Boot整合FreeMarker