SpringBoot整合ElasticSearch 入门级-简单易学

SpringBoot整合ElasticSearch

在整合ElasticSearch之前,先声明这次整合是根据狂神的视频学习整合的,对我来说是学习的笔记,也分享一下整个的步骤,后面会附上狂神视频链接!

我使用的ES版本是:windows 的 ES:7.9.1

关于ES和head下载安装先不做介绍!

我们想一想,整合ES是通过什么来进行操作连接的?是不是通过某一个客户端来连接ES服务端进行操作呀,那客户端怎么编写?

首先我们先登录ES官网

选择文档

SpringBoot整合ElasticSearch 入门级-简单易学_第1张图片

 

找到ElasticSearch Clients,这个位置就是介绍有哪些客户端可以进行连接ES

SpringBoot整合ElasticSearch 入门级-简单易学_第2张图片

那么我们点进去看一下,发现有多种连接方式,我们选择第一个的可以了

SpringBoot整合ElasticSearch 入门级-简单易学_第3张图片

再次点进去,选择高级客户端来进行操作

SpringBoot整合ElasticSearch 入门级-简单易学_第4张图片

再点,可以针对文档来进行学习哦,那么我英语水平比较低,看不懂,哈哈

SpringBoot整合ElasticSearch 入门级-简单易学_第5张图片

那么我们一般在创建springboot整合ES的使用都会去找到相关的依赖,那么去哪里找呢??

选择Geting started,找到Maven Reposity

SpringBoot整合ElasticSearch 入门级-简单易学_第6张图片

找到Maven configuration,这里就是依赖啦

SpringBoot整合ElasticSearch 入门级-简单易学_第7张图片

我们点击Initialization,看看怎么初始化

SpringBoot整合ElasticSearch 入门级-简单易学_第8张图片

到这里我们就差不多开始创建项目,进行代码的编写啦。

步骤

1. 创建项目

SpringBoot整合ElasticSearch 入门级-简单易学_第9张图片

SpringBoot整合ElasticSearch 入门级-简单易学_第10张图片

我这里只选择 Spring Data Elastissearch(Access + Driver),其它先不选了,毕竟我只做测试。最后就下一步,完成就可以 了

SpringBoot整合ElasticSearch 入门级-简单易学_第11张图片

2.看一下pom.xml的依赖

    
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter-data-elasticsearch
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
            
                
                    org.junit.vintage
                    junit-vintage-engine
                
            
        
    

SpringBoot整合ElasticSearch 入门级-简单易学_第12张图片

继续点进去

SpringBoot整合ElasticSearch 入门级-简单易学_第13张图片

往下翻可以找到已经集成了高版本的客户端的依赖

SpringBoot整合ElasticSearch 入门级-简单易学_第14张图片

有个问题,就是我下载的ES是7.9.1版本的,但是我点击右边的Maven,发现springboot导入的是7.6.2版本的

SpringBoot整合ElasticSearch 入门级-简单易学_第15张图片

为了让导入的和本地的ES版本一致,还需要配置pom.xml

最终如下:

    
        1.8
        
        7.9.1
    

    
        
            org.springframework.boot
            spring-boot-starter-data-elasticsearch
        

        
        
            com.alibaba
            fastjson
            1.2.62
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
            
                
                    org.junit.vintage
                    junit-vintage-engine
                
            
        
    

SpringBoot整合ElasticSearch 入门级-简单易学_第16张图片

ok,已经变成我想要的版本

3. 目录结构

SpringBoot整合ElasticSearch 入门级-简单易学_第17张图片

4.在config包下创建用来连接ES的客户端配置,用来进行初始化用的

@Configuration
public class ElasticSearchClientConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("127.0.0.1", 9200, "http")));
        return client;
    }
}

5.启动ElasticSearch和head,关于这两个的下载和安装这里先不做详解。

SpringBoot整合ElasticSearch 入门级-简单易学_第18张图片

SpringBoot整合ElasticSearch 入门级-简单易学_第19张图片

浏览器访问head

SpringBoot整合ElasticSearch 入门级-简单易学_第20张图片

 

6.开始编写代码,来对ES访问操作,这里只做测试,毕竟是跟狂神学习的,还有很多 地方不明白,还需见谅!!!

1)定义一个连接ES客户端对象

SpringBoot整合ElasticSearch 入门级-简单易学_第21张图片

 

这里注意的是,如果你觉得定义的客户端变量名太长,可以自己更改,但会报错,将@Autowired注解改为@Resource就好

2)测试索引的创建

    //测试索引的创建 Request
    @Test
    void testCreateIndex() throws IOException {
        //1. 创建索引请求
        CreateIndexRequest request = new CreateIndexRequest("jack_index");
        //2. 客户端执行请求,请求后,获得响应
        CreateIndexResponse response = restHighLevelClient.indices()
                .create(request, RequestOptions.DEFAULT);
        System.out.println(response);
    }

运行,在head中查看有没有创建成功,有就代表成功

SpringBoot整合ElasticSearch 入门级-简单易学_第22张图片

3)测试判断索引是否存在

    //测试判断索引是否存在
    @Test
    void testExistIndex() throws IOException {
        //1. 获取索引请求
        GetIndexRequest request = new GetIndexRequest("jack_index");
        boolean exists = restHighLevelClient.indices()
                .exists(request, RequestOptions.DEFAULT);
        if(exists){
            System.out.println("获取的索引存在");
        }else{
            System.out.println("获取的索引不存在");
        }
    }

SpringBoot整合ElasticSearch 入门级-简单易学_第23张图片

测试不存在的索引试试

SpringBoot整合ElasticSearch 入门级-简单易学_第24张图片

4)测试删除索引

    //测试删除索引
    @Test
    void testDeleteIndex() throws IOException {
        //1. 获取删除索引请求
        DeleteIndexRequest request =  new DeleteIndexRequest("jack_index");
        //2. 客户端执行请求,返回响应结果
        AcknowledgedResponse response = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
        System.out.println(response.isAcknowledged());
    }

SpringBoot整合ElasticSearch 入门级-简单易学_第25张图片

看一下head,看索引是否删除成功,刷新一下浏览器

SpringBoot整合ElasticSearch 入门级-简单易学_第26张图片

5)测试添加文档

之前我把索引给 删除掉了,我在重新创建回来

我们创建一个User对象,用来测试将对象存入ES中

在entity创建一个User类

public class User {
    private String name;
    private Integer age;
    private String sex;

    public User(String name, Integer age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    //getter  setter  toString....
}

编写测试

    //测试添加文档
    @Test
    void testAddDocument() throws IOException {
        //1. 创建对象
        User user = new User("jack", 23, "男");
        //2. 创建请求
        IndexRequest jack_index = new IndexRequest("jack_index");

        //3. 规则 PUT /jack_index/_doc/1
        //不指定类型,默认类型是_doc
        jack_index.id("1");//文档id
        jack_index.timeout(TimeValue.timeValueSeconds(1)); //设置超时时间
        //4. 将数据放入请求 JSON
        jack_index.source(JSON.toJSONString(user), XContentType.JSON);
        //5. 客户端发送请求, 获取响应结果
        IndexResponse response = restHighLevelClient
                .index(jack_index, RequestOptions.DEFAULT);

        System.out.println(response.toString());//信息返回
        System.out.println(response.status());//命令返回状态
    }

运行

可以看到数据添加成功

SpringBoot整合ElasticSearch 入门级-简单易学_第27张图片

6)测试判断文档是否存在

//测试判断文档是否存在
    @Test
    void testIsExists() throws IOException {
        GetRequest jack_index = new GetRequest("jack_index", "1");

        //不获取返回的 _source的上下文
        jack_index.fetchSourceContext(new FetchSourceContext(false));
        jack_index.storedFields("_none_");

        boolean exists = restHighLevelClient.exists(jack_index, RequestOptions.DEFAULT);

        System.out.println(exists);
    }

我们可以进到GetRequest这一个类里面去看一下

SpringBoot整合ElasticSearch 入门级-简单易学_第28张图片

看到了没有,它默认指定了索引的类型

不理了,我先运行

SpringBoot整合ElasticSearch 入门级-简单易学_第29张图片

7)测试获取某一个文档的信息

    //测试获取某一个文档信息
    @Test
    void testGetDocument() throws IOException {
        GetRequest jack_index = new GetRequest("jack_index", "1");
        GetResponse response = restHighLevelClient.get(jack_index, RequestOptions.DEFAULT);

        System.out.println(response.getSourceAsString()); //打印文档的内容
        System.out.println(response); //返回的全部内容和命令一样的
    }

8)测试更新文档信息

    //测试更新文档信息
    @Test
    void testUpdateDocument() throws IOException {
        //获取更新请求
        UpdateRequest updateRequest = new UpdateRequest("jack_index", "1");
        //设置更新超时时间
        updateRequest.timeout("1s");

        User user = new User("小杰", 22, "男");
        updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
        //执行
        UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
        System.out.println(updateResponse.status());//这个是状态
    }

运行,到浏览器去查看

返回的状态信息

SpringBoot整合ElasticSearch 入门级-简单易学_第30张图片

SpringBoot整合ElasticSearch 入门级-简单易学_第31张图片

9)测试删除指定的文档

    //测试删除文档
    @Test
    void testDeleteDocument() throws IOException {
        //获取删除请求
        DeleteRequest deleteRequest = new DeleteRequest("jack_index", "1");
        //设置删除超时时间
        deleteRequest.timeout("1s");
        //执行
        DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println(delete.status());
    }

运行

SpringBoot整合ElasticSearch 入门级-简单易学_第32张图片

10)特殊情况,批量插入数据,这个地方值得注意

    //特殊情况,批量插入数据
    @Test
    void testBulkRequest() throws IOException {
        //通过BulkRequest来进行批量操作
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout("10s");

        List users = new ArrayList<>();
        users.add(new User("张三", 16, "男"));
        users.add(new User("李四", 25, "男"));
        users.add(new User("王五", 30, "男"));
        users.add(new User("王昭君", 20, "男"));
        users.add(new User("貂蝉", 22, "男"));

        Integer i = 1;
        for(User user : users){
            bulkRequest.add(new IndexRequest("jack_index")
                    .id((i++).toString())
                    .source(JSON.toJSONString(user),XContentType.JSON));
        }

        //批处理
        BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulkResponse.hasFailures()); //是否失败,返回false代表成功
    }

运行

SpringBoot整合ElasticSearch 入门级-简单易学_第33张图片

SpringBoot整合ElasticSearch 入门级-简单易学_第34张图片

11)测试查询

我这里是查询含有王的名字都给查询出来

    //测试查询
    @Test
    void testSearch() throws IOException {
        //1. 获取搜索请求
        SearchRequest jack_index = new SearchRequest("jack_index");

        //2. 构建搜索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //设置查询条件 (查询名字含有王的User),使用QueryBuilders快速精确匹配
        TermQueryBuilder termQuery = QueryBuilders.termQuery("name", "王");
        sourceBuilder.query(termQuery);

        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        jack_index.source(sourceBuilder);//搜索请求执行的搜索条件,装载

        //3. 执行
        SearchResponse search = restHighLevelClient.search(jack_index, RequestOptions.DEFAULT);
        //System.out.println(JSON.toJSONString(search.getHits().getHits()));
        //遍历    查询的结果会封装到getHits中
        for(SearchHit documentFields : search.getHits()){
            System.out.println(documentFields.getSourceAsMap());
        }
    }

SpringBoot整合ElasticSearch 入门级-简单易学_第35张图片

12)测试全部查询

    //测试全部查询
    @Test
    void testQueryAll() throws IOException {
        //1. 获取搜索请求
        SearchRequest searchRequest = new SearchRequest("jack_index");
        //2. 构建搜索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //设置查询条件 matchAllQuery查询所有文档
        MatchAllQueryBuilder allQuery = QueryBuilders.matchAllQuery();
        sourceBuilder.query(allQuery);
        searchRequest.source(sourceBuilder);//搜索请求执行的搜索条件,装载
        //3. 执行
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //遍历    查询的结果会封装到getHits中
        for(SearchHit documentFields : search.getHits()){
            System.out.println(documentFields.getSourceAsMap());
        }
    }

SpringBoot整合ElasticSearch 入门级-简单易学_第36张图片

成功

测试到这里就结束了,操作ES都是RESTful风格的

 

总结

       这次使用springboot对ElasticSearch进行整合对我来说还是有很多收获的,也有许多的地方不懂,特别是操作访问ES中的数据,容易忘,这是不熟练的问题,至少对于我来说有了一个对ElasticSearch的认识吧,加油!

在这里我感谢狂神,他的讲解的视频很好,对我来说很有帮助

狂神ElasticSearch视频链接

 

你可能感兴趣的:(springboot,elasticsearch,spring,boot)