SpringBoot系列:Springboot简单整合ElasticSearch(检索)


   在B站学习了狂神的ElasticSearch的教学视频,顺便记录一下自己的学习这个知识的过程,因为没有狂神笔记,下面的都是自己手敲的,很多学习思路都是借鉴狂神,代码编写也是,想看怎么学习ElasticSearch的小伙伴可以去看看狂神怎么学习的,狂神也不仅说了ES,还有很多内容,我只是简单的整合,不说了,开冲把(代码链接在文章末尾)

  ES学习视频链接


1、新建工程

选择相关依赖:
在这里插入图片描述
在这里插入图片描述

保证导入的依赖要和es的版本一致,自定义版本依赖:

<properties>
    <java.version>1.8</java.version>
    <elasticsearch.version>7.4.1</elasticsearch.version>
</properties>

2、新建ElasticSearchClientConfig配置类

  从ElasticSearch官方文档文档中找到如下内容
在这里插入图片描述

  一般都选用这个Java REST Client [7.9] — other versions,记住要跟自己ES版本号一样哈
在这里插入图片描述


然后:
在这里插入图片描述

  找到初始化:
在这里插入图片描述

  将下面这段代码复制到我们的配置类中,这里更重要的是记录学习方法,代码只会粘贴复制是还不够的
在这里插入图片描述

  配置类主要代码:

@Configuration //相当于xml
public class ElasticSearchClientConfig {
    /**
     *   spring <bean id="restHighLevelClient" 
                     class = "RestHighLevelClient">
     */

    @Bean
    public RestHighLevelClient restHighLevelClient(){
//        RestHighLevelClient:高级客户端
        RestHighLevelClient client = new RestHighLevelClient(
                //这里我就演示一个连接
                RestClient.builder(
                  new HttpHost("localhost", 9200, "http"));
//                new HttpHost("localhost", 9201, "http")));
        return  client;
    }
}

3、关于编写索引的测试类

   1、在测试类中添加配置类属性

/**
 * 引用测试类
 * @Autowired 是默认根据类型匹配
 * @Qualifier 类型匹配后再找方法名,这样就确定我们找到的注入到的
 * bean是我们自定义的
 */
@Autowired
@Qualifier("restHighLevelClient")
private RestHighLevelClient client;

   2、测试创建索引方法

/**
 * 创建索引 request,面向对象来操作
 */
@Test
public void test01(){
    //发起创建索引请求,索引 --->  数据库 索引必须是小写哈~
    CreateIndexRequest request =
             new CreateIndexRequest("Vinda_index");
    //es服务器执行请求 indicesClient , 请求后获得对应响应
    CreateIndexResponse response = null;
    try {
        response = client
        .indices().create(request, RequestOptions.DEFAULT);
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("请求发生异常!!!");
    }
    System.out.println("response:"+response);
}

运行成功后的结果:打开Elasticsearch-head,输入:http://IP:9100/

  查看到运行结果,成功添加:
在这里插入图片描述

  之后的查询和删除都是在官方文档都有提示,我们可以根据文档来学习的:
ES官方AIP使用文档

  代码也写出了:

/**
 * 获取索引 request
 */
@Test
public void test02(){
    //发起获取引请求,索引 --->  数据库 索引必须是小写哈~
    GetIndexRequest request = new GetIndexRequest("vinda_index");
    //es服务器执行请求 indicesClient , 请求后获得对应响应
    try {
        boolean b = client
            .indices().exists(request, RequestOptions.DEFAULT);
        if(b) System.out.println("是否存在:"+b);
        else System.out.println("是否存在:"+b);
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("请求发生异常!!!");
    }
}
/**
 * 删除索引
 */
 @Test
public void test03(){
    //发起删除引请求,索引 --->  数据库 索引必须是小写哈~
    DeleteIndexRequest request = 
        new DeleteIndexRequest("vinda_index");
    //es服务器执行请求 indicesClient , 请求后获得对应响应
    try {
        AcknowledgedResponse b = client.indices().delete(request, RequestOptions.DEFAULT);
        if(b.isAcknowledged()) System.out.println("是否删除成功:"+b);
        else System.out.println("是否删除成功:"+b);
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("请求发生异常!!!");
    }
}

4、关于文档的api测试

  1、先新建entity实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private String sname;
    private Integer sage;

}

  2、添加测试方法

/**
 * 类型     -->  相当于数据表
 * 添加文档  --> 相当于数据段
 */
@Test
public void test04(){
    //创建对象
    Student student = new Student("vinda",21);
    //创建请求
    IndexRequest request = new IndexRequest("vinda_index");
    //规则输入 put /vinda_index/1;
    request.id("1");
    request.timeout(TimeValue.timeValueSeconds(1));
    request.timeout("1s");

    //将数据放入到请求  student - > json
    request.source
        (JSON.toJSONString(student), XContentType.JSON);

    //客户端发送请求,获取响应结果
    IndexResponse response = null;
    try {
        response = client.index(request, RequestOptions.DEFAULT);
        System.out.println("本次响应结果:"+response.toString());
        System.out.println("本次执行状态:"+response.status());
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("本次请求出现异常");
    }

}

  成功提示:状态为 create

在这里插入图片描述


  3、获取文档内容测试

/**   
    获取文档
 */
@Test
public void test05(){

    // get /vinda_index/1
    GetRequest request = new GetRequest("vinda_index","1");
    //不获取返回的 _source 的上下文
    request.fetchSourceContext(new FetchSourceContext((false)));

    try {
        boolean b = client
            .exists(request, RequestOptions.DEFAULT);
        if(b) {
            System.out.println("请求成功");
            //获取文档内容
            GetResponse response = client
                .get(request,RequestOptions.DEFAULT);
      //获取文档内容,里面有soure 、 version等方法
    System.out.println(response); 
     //打印文档内容
    System.out.println(response.getSourceAsString());
        }
        else System.out.println("请求失败哦");
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("本次请求出现异常");
    }
}

  请求成功截图:
在这里插入图片描述

  更新文档:

@Test
public void test06(){
    UpdateRequest updateRequest 
        = new UpdateRequest("vinda_index","1");
    //设置超时时间
    updateRequest.timeout("1S");
    //放入需要更新的对象
    Student student = new Student("VINDA",22);
    //更新
    updateRequest.doc(JSON.toJSONString(student),
        XContentType.JSON);
    //发送更新请求
    try {
        UpdateResponse update = client
            .update(updateRequest, RequestOptions.DEFAULT);
        System.out.println("更新是否成功:"+update.status());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

  4、删除文档

@Test
public void test07(){
    DeleteRequest deleteRequest
         = new DeleteRequest("vinda_index","1");
    deleteRequest.timeout("1S");
    try {
        DeleteResponse deleteResponse 
            = client.delete(deleteRequest,RequestOptions.DEFAULT);
        System.out.println("删除是否成功:"+deleteResponse.status());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

  5、大量插入数据

@Test
public void test08(){
    BulkRequest bulkRequest = new BulkRequest();
    //因为大量插入数据,我们应该考虑设置的时间久一点
    bulkRequest.timeout("10S");
    List<Student> students = new ArrayList<>();
    students.add(new Student("vinda1",22));
    students.add(new Student("vinda2",23));
    students.add(new Student("vinda3",24));
    students.add(new Student("weida1",25));
    students.add(new Student("weida1",25));

    //插入
    for (int i = 0; i < students.size() ; i++) {
        bulkRequest.add(
                new IndexRequest("vinda_index").id(""+(i+1))
                .source(JSON.toJSONString((students.get(i))),XContentType.JSON));

    }
    //查看返回状态
    try {
        BulkResponse bulkResponse = client.bulk(bulkRequest,RequestOptions.DEFAULT);
        System.out.println(bulkResponse.hasFailures());  //是否成功
    } catch (IOException e) {
        System.out.println("批量添加失败!!!");
    }

}

  flase代表成功
在这里插入图片描述
在这里插入图片描述

  6、大量查询

  可以新建一个工具类,类种添加常用的ES数据信息

public class ESconst {
    public static final String ES_INDEX = "vinda_index";
}

查询代码

/**
 *  查询:搜索请求,条件构造
 *  SearchRequest 搜索请求
 *  SearchSourceBuilder条件构造
 *  HighlightBuilder 构建高亮
 *  TermQueryBuilder精确查询
 *  MatchAl LQueryBuilder
 *  xxx QueryBuilder 对应我们刚才看到索引命令
 */
@Test
public void test09(){
    SearchRequest searchRequest 
        = new SearchRequest(ESconst.ES_INDEX);
    //构建搜索条件
    SearchSourceBuilder sBuilder 
        = new SearchSourceBuilder();

    //查询条件,我们可以使用QueryBuilders工具来实现
    //QueryBuilder.termQuery        精确
    //QueryBuilders.matchAllQuery() 匹配所有

    //1、查询sname = weida的数据
    TermQueryBuilder termQueryBuilder 
        = QueryBuilders.termQuery("sname", "weida1");
    //2、装载查询条件到构造器中
    sBuilder.query(termQueryBuilder);
    //3、设置超时时 秒级
    sBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
    //4、发送查询请求
    searchRequest.source(sBuilder);
    //5、查看返回结果
    try {
        SearchResponse searchResponse 
            = client.search(searchRequest,RequestOptions.DEFAULT);
        //System.out.println(JSON.toJSONString(searchResponse.getHits()));
        //遍历结果
        for (SearchHit hit : searchResponse.getHits().getHits()) {
            System.out.println(hit.getSourceAsMap());
        }
        System.out.println("查询完毕!!!");
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("返回数据有误!!!");
    }

    /**
     *  matchAllQuery源码
     *  matchAllQuery的属性
     *  NAME = "match_all";
     *  ObjectParser<MatchAllQueryBuilder, Void> PARSER = new ObjectParser("match_all", MatchAllQueryBuilder::new);
     */
    System.out.println("全部查询:");
    //1、查询所有
    MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
    //2、装载查询条件到构造器中
    sBuilder.query(matchAllQueryBuilder);
    //3、设置超时时 秒级
    sBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
    //4、发送查询请求
    searchRequest.source(sBuilder);
    //5、查看返回结果
    try {
        SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);
        //System.out.println(JSON.toJSONString(searchResponse.getHits()));
        //遍历结果
        for (SearchHit hit : searchResponse.getHits().getHits()) {
            System.out.println(hit.getSourceAsMap());
        }
        System.out.println("查询完毕!!!");
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("返回数据有误!!!");
    }
}

查询结果:
在这里插入图片描述

5、小结

  这只是简单的ElasticSearch整合,还有如何实现高亮、爬取数据等都还没整理,学习路上是不能停歇的,加油吧,共勉,小白写得不好地方欢迎评论区留言讨论,嘿嘿~

-----------------------代码冲呀!!!!点我去Github-----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值