zoukankan      html  css  js  c++  java
  • Spring Boot整合ElasticSearch和Mysql 附案例源码

    导读

      前二天,写了一篇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
  • 相关阅读:
    Corn Fields
    状压DP
    全排列函数
    搜索
    前缀和与差分
    最小花费
    【Lintcode】062.Search in Rotated Sorted Array
    【LeetCode】039. Combination Sum
    【LeetCode】040. Combination Sum II
    【LeetCode】047. Permutations II
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/13473132.html
Copyright © 2011-2022 走看看