大聪明教你学Java | Spring Boot 整合 ElasticSearch 及其简单 *** 作

大聪明教你学Java | Spring Boot 整合 ElasticSearch 及其简单 *** 作,第1张

前言

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

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

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

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

  1. 引入 Maven 依赖
  2. 增加 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;
    }
}

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

  1. 我们可以看到配置文件中使用的端口是9300而不是9200。9200端口是 ElasticSearch 节点与外部通讯使用的端口。它是 http 协议的 RESTful 接口(各种CRUD *** 作都是走的该端口,例如查询:http://localhost:9200/user/_search);9300端口是 ElasticSearch 节点之间通讯使用的端口。它是 tcp 通讯端口,集群间和 TCPclient 都走的此端口,所以 Java 程序中使用 ElasticSearch 时,在配置文件中要使用 9300 端口。
  2. Spring Boot 版本号和 ElasticSearch 版本号是有对应关系的,如果版本对应有误,则可能导致无法正常启动项目的。(本人使用的 Spring Boot 版本是 2.2.4.RELEASE,ElasticSearch 版本是6.2.2。具体版本号对应关系如下图所示~)
  3. 如果项目中引入了 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 也就讲完了,上面提到的 *** 作方式都是最简单的增、删、改、查,各位小伙伴可以将上面的代码拿到自己的环境中尝试一下,希望能帮助小伙伴们快速入门😊

小结

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

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

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/722384.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存