导读

  前二天,写了一篇ElasticSearch7.8.1从入门到精通的(点我直达),但是还没有整合到SpringBoot中,下面演示将ElasticSearch和mysql整合到Spring Boot中,附演示源码。

项目介绍

模仿NBA网站

网址地址:点我直达

接口开发

  1. 将数据库数据导入到ElasticSearch
  2. 通过姓名查找球员
  3. 通过国家或者球队查询球员
  4. 通过姓名字母查找球员

项目搭建

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 附案例源码的更多相关文章

  1. Spring Boot整合Elasticsearch

    Spring Boot整合Elasticsearch   Elasticsearch是一个全文搜索引擎,专门用于处理大型数据集.根据描述,自然而然使用它来存储和搜索应用程序日志.与Logstash和K ...

  2. 【spring boot】【elasticsearch】spring boot整合elasticsearch,启动报错Caused by: java.lang.IllegalStateException: availableProcessors is already set to [8], rejecting [8

    spring boot整合elasticsearch, 启动报错: Caused by: java.lang.IllegalStateException: availableProcessors ], ...

  3. Elasticsearch学习(3) spring boot整合Elasticsearch的原生方式

    前面我们已经介绍了spring boot整合Elasticsearch的jpa方式,这种方式虽然简便,但是依旧无法解决我们较为复杂的业务,所以原生的实现方式学习能够解决这些问题,而原生的学习方式也是E ...

  4. Spring Boot启动命令参数详解及源码分析

    使用过Spring Boot,我们都知道通过java -jar可以快速启动Spring Boot项目.同时,也可以通过在执行jar -jar时传递参数来进行配置.本文带大家系统的了解一下Spring ...

  5. Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 – <史蒂夫·乔布斯传> 』 运行环境: ...

  6. spring boot 整合 elasticsearch 5.x

    spring boot与elasticsearch集成有两种方式.一种是直接使用elasticsearch.一种是使用data中间件. 本文只指针使用maven集成elasticsearch 5.x, ...

  7. SpringBoot学习入门之Hello项目的构建、单元测试和热部署等(配图文,配置信息详解,附案例源码)

    前言: 本文章主要是个人在学习SpringBoot框架时做的一些准备,参考老师讲解进行完善对SpringBoot构建简单项目的学习汇集成本篇文章,作为自己对SpringBoot框架的总结与笔记. 你将 ...

  8. Spring Boot 整合 elasticsearch

    一.简介 我们的应用经常需要添加检索功能,开源的 ElasticSearch 是目前全文搜索引擎的 首选.他可以快速的存储.搜索和分析海量数据.Spring Boot通过整合Spring Data E ...

  9. Elasticsearch学习(4) spring boot整合Elasticsearch的聚合操作

    之前已将spring boot原生方式介绍了,接下将结介绍的是Elasticsearch聚合操作.聚合操作一般来说是解决一下复杂的业务,比如mysql中的求和和分组,由于博主踩的坑比较多,所以博客可能 ...

随机推荐

  1. js:数组(创建、遍历、函数)

    1.数组 采用单个变量只能存储一个数据,数组能够存储多个数据,获取方式也比较简单.它是将一组数据存储在当个变量下的存储方式. 2.数组的创建 (1)new方式创建,不指定数组长度 <script ...

  2. 有关 Session 的那些事儿

    原文链接: https://blog.by24.cn/archives/about-session.html Web 开发中,Session 是经常用到的概念,但是在日常交流中,似乎又经常引起误解. ...

  3. 题解 洛谷 P4602 【[CTSC2018]混合果汁】

    注意到问题具有单调性,所以一个询问可以通过二分答案来解决. 对于多组询问,就采用整体二分来处理. 将果汁按\(d\)从大到小排序,二分出一个位置\(mid\),只考虑在位置\(mid\)之前的果汁,其 ...

  4. java 将整型数组转化为字符串

    java arrays 和arrayList 的区别 package com.vc; import java.util.Arrays; public class Demo05 { public sta ...

  5. 离线安装 docker

    1.基础环境 操作系统:CentOS 7.8 docker 版本:18.06.1 2.docker 下载 2.1 官方地址 https://download.docker.com/linux/stat ...

  6. 2018年5月15日的sqlite安装和数据库记录

    sqlite数据库安装在d:\sqlite_files运行sqlite3查看数据表,命令,.tables 数据库文件 d:\sqlite_files\device.db create table de ...

  7. lua中 table.getn(t) 、#t、 table.maxn(t) 这三个什么区别?

    lua中 table.getn(t) .#t. table.maxn(t) 这三个什么区别? RTlocal t = {1,888,x= 999,b=2,5,nil,6,7,[10]=1,8,{z = ...

  8. python迭代器和装饰器

    一.迭代器 1.迭代器协议:对象必须提供一个__next__()方法,执行该方法要么返回迭代中的下一个对象,要么引起一个StopIteration异常以终止迭代,迭代只能向后进行不能往前回退 2.可迭 ...

  9. The Google File System(论文阅读笔记)

    概述 ​ GFS:一个可扩展的分布式文件系统,用于大型分布式数据相关应用,TB级的数据,成千上万的并发请求. 设计概览 假设 组件的失效比异常更加常见 多数的文件修改操作是追加数据而不是重写原来的数据 ...

  10. More JOIN operations -- SQLZOO

    The JOIN operation 注意:where语句中对表示条件的需要用单引号, 下面的译文使用的是有道翻译如有不正确,请直接投诉有道 01.List the films where the y ...