springboot集成spring-data-elasticsearch 完成对es的操作

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: springboot集成spring-data-elasticsearch 完成对es的操作

一、集成spring-data-elasticsearch

  1. 在springboot中集成spring-data-elasticsearch 非常的简单只需要引入下面的start:


<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>


  1. 在 application.properties l文件配置以下参数:


# es集群的名字
spring.data.elasticsearch.cluster-name=elasticsearch
# es机器的可用节点
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300

二、将mysql中数据导入es

本文使用了lombok 加快开发效率,同时使实体类代码看上去更简洁,修改起来也方便1.使用lombok也很简单具体可参考以下连接:一篇文章搞懂Lombok


  1. 编写实体类


@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName="myes",type="myuser",refreshInterval="-1")
public class User {
    @Id // 这个id加不加都不影响导入
    private Integer id;
    private String firstName;
    private String lastName;
    private  Integer age;
    //type 为字段类型
    @Field(type = FieldType.Keyword)
    private String About;
}


  1. 编写导入的Controller


RestController
@RequestMapping("user")
public class UserController {
    private static final Logger log= LoggerFactory.getLogger(UserController.class);
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private ElasticsearchTemplate estemplate;
    @RequestMapping("queryString")
    public Object queryString(String key, @PageableDefault Pageable pageable){
        return userRepository.queryString(key, pageable);
    }
    /**
     * 模拟将mysql的数据导入es中
     * @return
     */
    @RequestMapping("mysqlToEs")
    public String mysqlToEs(){
        log.info("开始将数据导入es");
        long startTime = System.currentTimeMillis();
        //模拟从mysql中取到user的集合
        List<User> userListMysql = getUserListForMysql();
        try {
            int count = 0;
            if (estemplate.indexExists(User.class)) {
                // 如果存在index则先删除,避免数据冗余或者数据刷新不完整
                estemplate.deleteIndex(User.class);
                log.info("删除旧index");
            }
            estemplate.createIndex(User.class);
            //解决高版本的@Field注解失效问题
            estemplate.putMapping(User.class);
            log.info("新建index");
            ArrayList<IndexQuery> queries = new ArrayList<>();
            for (User entity : userListMysql ) {
                IndexQuery indexQuery = new IndexQuery();
                //这个地方就是设置主键id,当前你也可以换成其他字段,或者uuid,这个地方默认使用id作为_id的值,即使实体类上不加@Id注解
                //indexQuery.setId(UUID.randomUUID().toString());
                indexQuery.setId(entity.getId().toString());
                indexQuery.setObject(entity);
                indexQuery.setIndexName("myes");
                indexQuery.setType("myuser");
                queries.add(indexQuery);
                if (count % 500 == 0) {
                    estemplate.bulkIndex(queries);
                    queries.clear();
                }
                count++;
            }
            if (queries.size() > 0) {
                estemplate.bulkIndex(queries);
                log.info("导入完成,耗时:" + (System.currentTimeMillis() - startTime) + "ms"+"导入总条数:"+count);
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("导入失败");
        }
        return "导入成功!";
    }
    public List<User> getUserListForMysql(){
        ArrayList<User> userListMysql = new ArrayList<>();
        for (int i = 1001; i <1060 ; i++) {
           userListMysql.add(new User(i,"张","三"+i,i,"简介"+i)) ;
        }
        return userListMysql;
    }
    @RequestMapping("/flushByIndex")
    public String flushEsByIndex(){
        DeleteQuery deleteQuery = new DeleteQuery();
        deleteQuery.setIndex("myes");
        deleteQuery.setType("myuser");
        //这个查询一定要有,查询中不设置任何条件即认为是删除当前索引的所有记录
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        deleteQuery.setQuery(boolQueryBuilder);
        estemplate.delete(deleteQuery);
        return "清空es数据成功";
    }
}


  1. 使用postman访问连接:localhost:8090/user/mysqlToEs



  1. 使用kibana查看是否导入成功


三、使用ElasticsearchTemplate操作es

本文以下代码测试主要来源于以下连接具体可以参考一下连接:

ElasticsearchTemplate的详细使用,完成多条件查询、匹配度查询


四、github源码地址

为了方便各位朋友的测试,使用,学习特将源码发布到了github,欢迎下载学习,交流,共同进步!

https://github.com/Dr-Water/springdata-es-action


ElasticSearch实战 之 es,kibana 的安装和使用

springboot 、spring-data-elasticsearch、elasticserach的版本对应关系

优秀的elasticsearch学习参考文章合集


相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
目录
相关文章
|
5月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
650 2
|
6月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
5693 2
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
存储 JSON Java
779 0
|
7月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1192 3
|
10月前
|
JSON 安全 数据可视化
Elasticsearch(es)在Windows系统上的安装与部署(含Kibana)
Kibana 是 Elastic Stack(原 ELK Stack)中的核心数据可视化工具,主要与 Elasticsearch 配合使用,提供强大的数据探索、分析和展示功能。elasticsearch安装在windows上一般是zip文件,解压到对应目录。文件,elasticsearch8.x以上版本是自动开启安全认证的。kibana安装在windows上一般是zip文件,解压到对应目录。elasticsearch的默认端口是9200,访问。默认用户是elastic,密码需要重置。
5333 0
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
600 0
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
447 0
|
消息中间件 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
530 0