前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot 整合ES|解放你的mysql

SpringBoot 整合ES|解放你的mysql

作者头像
AI码师
发布2022-09-19 11:50:45
5710
发布2022-09-19 11:50:45
举报

代码已经上传到码云:https://gitee.com/lezaiclub/springboot-hyper-integration.git,欢迎白嫖

引言

平时我们存储数据用的最多的就是mysql,在前面的文章里我也分享过很多关于mysql的知识,今天我们来集成另外一种数据存储系统ES,它是一款NoSql型数据库,主要使用场景有商品搜索,文章搜索等,关键词就是搜索。我们先简单介绍下ES。

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便

这是来自于百度百科的解释,其实我们就直接把它理解成搜索引擎就行了,接下来,我们就开始快速集成,然后上手使用吧!

安装ES

本篇介绍的是如何通过docker安装es,提前你得有docker环境

拉取ES镜像

代码语言:javascript
复制
docker pull elasticsearch:7.6.2

创建挂载目录

代码语言:javascript
复制
mkdir -p /Users/lezai/docker/volumes/data/elasticsearch/config/
mkdir -p /Users/lezai/docker/volumes/data/elasticsearch/data
mkdir -p /Users/lezai/docker/volumes/data/elasticsearch/plugins

编辑配置文件

代码语言:javascript
复制
vim /Users/lezai/docker/volumes/data/elasticsearch/config/elasticsearch.yml

elasticsearch.yml

代码语言:javascript
复制
http.host: 0.0.0.0

运行执行脚本

代码语言:javascript
复制
docker run --name elasticsearch -p 9200:9200  -p 9300:9300 \
 -e "discovery.type=single-node" \
 -e ES_JAVA_OPTS="-Xms256m -Xmx256m" \
 -v /Users/lezai/docker/volumes/data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
 -v /Users/lezai/docker/volumes/data/elasticsearch/data:/usr/share/elasticsearch/data \
 -v /Users/lezai/docker/volumes/data/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
 -d elasticsearch:7.6.2

安装成功后

在浏览器输入 http://localhost:9200,如果出现以下内容,则代表安装成功

代码语言:javascript
复制
{
  "name" : "43e2638f84ac",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "hZKT7NQNRl-Dg2Xrb3isGg",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

配置项目

添加必要依赖

代码语言:javascript
复制
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--        lombok 不用写写get和set,不是本部分必备包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.18</version>
        </dependency>
    </dependencies>

添加实体

其实这里的实体对应的就是ES索引

@Document(indexName = "sys_user") 代表映射的是sys_user 索引

@Field(type = FieldType.Keyword) 代表字段应设在es中是keyword类型

这里就不介绍过多的ES用法

代码语言:javascript
复制
package com.aims.springbootes.entity;

import lombok.Builder;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.io.Serializable;
import java.util.List;

@Document(indexName = "sys_user")   //文档
@Data
@Builder
public class SysUser implements Serializable {
    @Id //主键
    private String id;  //ES中id不能定义为Long
    private String username;
    private String password;
    private int level;
    @Field(type = FieldType.Keyword)
    private List<String> roles;
}

添加操作es的dao

ElasticsearchRepository 遵循Spring-data的规范,所以操作es,就相当于我们使用jpa去操作数据库一样

代码语言:javascript
复制
package com.aims.springbootes.dao;

import com.aims.springbootes.entity.SysUser;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 第一种方式,类似于JPA,编写一个ElasticsearchRepository
 *  第一个泛型为Bean的类型
 *  第二个泛型为Bean的主键类型
 */
@Repository
public interface SysUserDao extends ElasticsearchRepository<SysUser,String> {

}

添加配置信息

代码语言:javascript
复制
spring:
    elasticsearch:
      rest:
        uris: http://localhost:9200

编写test,测试添加数据到ES中

这里通过往ES中塞入1000条数据,我们运行下,但是我们现在不知道有没有插入进去。

代码语言:javascript
复制
    @Test
    public void testInsert() {
        List<String> list = new ArrayList<>();
        list.add("teacher");
        list.add("student");
        list.add("admin");
        list.add("leader");
        for (int i = 0; i < 1000; i++) {
            int toIndex = new Random(1).nextInt(4);
            SysUser build = SysUser.builder()
                    .password("123456")
                    .username("AI码师")
                    .level(i)
                    .roles(list.subList(0, toIndex))
                    .build();
            sysUserDao.save(build);
        }
        System.out.printf("结束");
    }

在编写一个查询的,来验证是否插入成功

代码语言:javascript
复制
    @Test
    public void testFindAll(){
        Iterable<SysUser> all = sysUserDao.findAll();
        all.forEach((sysUser)->{
            System.out.printf(sysUser.getId());
        });
    }

到这已经集成了ES,更多Spring-Data语法可以参考JPA的写法,在IDEA中会有很多智能提示,帮助你写的。

集成Spring-data-es后的思考

使用spring-data-es 提供的ElasticsearchRepository 只能进行简单的增删改差操作,如果碰到一些稍微复杂的聚合操作,他就很难应付了,所以这里有几个建议:

  • 如果只需要做简单增删改查操作,直接继承ElasticsearchRepository即可
  • 如果项目中有非常复杂的查询或聚合操纵,可以使用结合ElasticsearchRestTemplate做一些复杂的操作,这个包不需要再引用其他依赖,已经集成在spring-data-es里面了。

如何利用客户端快速编写ES 语句

这里我要介绍一款软件 kibana,它和es是老组合了,通过它能够直接连接es,直接在页面编写ES语句,值得一提的是它的语法智能提示简直不要太棒了

docker安装kibana

拉取镜像

这个一定要和es的版本保持一致,防止api不兼容

代码语言:javascript
复制
docker pull kibana:7.6.2

创建挂载目录

代码语言:javascript
复制
mkdir -p /Users/lezai/docker/volumes/data/kibana/config/

编辑配置文件

`vim /Users/lezai/docker/volumes/data/kibana/config/kibana.yml

代码语言:javascript
复制
#
# ** THIS IS AN AUTO-GENERATED FILE **
#
# Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true

运行启动脚本

当然要先保证es已经启动了,否则kibana无法启动,因为要依赖前者

代码语言:javascript
复制
 docker run -d \
  --name=kibana \
  --restart=always \
  --link elasticsearch:elasticsearch \
  -p 5601:5601 \
  -v /Users/lezai/docker/volumes/data/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml \
  kibana:7.6.2

等待一两分钟,打开浏览器 http://localhost:5601 如果出现下面这个,就再等一会

点击小扳手,打开客户端

输入查询语句

代码语言:javascript
复制
POST sys_user/_search
{
}

点击执行按钮,可以看到我们插入的数据

到这里,已经介绍完了如何集成es,以及如何使用kibana 快速编写sql,进行查询,咱们下期再见

关注公众号回复“干货领取”获得2021最新面试题一套

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乐哥聊编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 安装ES
    • 拉取ES镜像
      • 创建挂载目录
        • 编辑配置文件
          • 运行执行脚本
            • 安装成功后
            • 配置项目
              • 添加必要依赖
                • 添加实体
                  • 添加操作es的dao
                    • 添加配置信息
                      • 编写test,测试添加数据到ES中
                      • 集成Spring-data-es后的思考
                      • 如何利用客户端快速编写ES 语句
                        • docker安装kibana
                          • 拉取镜像
                          • 创建挂载目录
                          • 编辑配置文件
                          • 运行启动脚本
                      相关产品与服务
                      Elasticsearch Service
                      腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档