ElasticSearch(三)SpringBoot 整合ES

ElasticSearch(三)SpringBoot 整合ES

使用Java API

这种方式,官方已经明确表示在ES 7.0 版本中弃用 TransportClient 客户端,且在8.0 版本中完全移除它。

可以参考:https://blog.csdn.net/jacksonary/article/details/82729556

官方文档:https://www.elastic.co/guide/en/elasticsearch/client/index.html

ElasticSearch(三)SpringBoot 整合ES

ElasticSearch-Rest- client

9300 TCP

spring:data-elasticsearch:transport-api.jar

  • SpringBoot 版本不同,transport-api.jar 不同,不能适配es版本
  • 7.x 己经不建议使用,8以后就要废弃

9200: HTTP

  • JesClient, 非官方,更新慢
  • RestTemplate:模拟发 HTTP 请求,ES 很多操作需要自己封装,麻烦
  • HttpClient:同上
  • ElasticSearch-Rest- client :官方的RestClient 封装了ES操作,API层次分明,上手简单

最终我们需要使用Rest Client来和ES建立HTTP连接。

官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-getting-started-maven.html

JAVA DOC:https://artifacts.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-high-level-client/7.17.3/index.html

到这的时候发现

ElasticSearch(三)SpringBoot 整合ES

所以准备手动更新es和kibana的版本。参考docker hub给出的版本。

出现的第一个错误。

ElasticSearch(三)SpringBoot 整合ES

https://github.com/medcl/elasticsearch-analysis-ik/releases找到8.1.2。

我无语。。。。

ElasticSearch(三)SpringBoot 整合ES

只有到8.1.2.。。。。。。。。无语死了😓

elasticsearch Tags | Docker Hub

去找8.1.2.

总结一下吧。

ElasticSearch(三)SpringBoot 整合ES

遇到的第一个错误

ElasticSearch(三)SpringBoot 整合ES

官方配置介绍:https://www.elastic.co/guide/en/kibana/current/settings.html

ElasticSearch(三)SpringBoot 整合ES

所以要看一下kibana的配置文件。

ElasticSearch(三)SpringBoot 整合ES

根据官网介绍需要改成自己虚拟机的地址。

ElasticSearch(三)SpringBoot 整合ES

起来了。

ElasticSearch(三)SpringBoot 整合ES

有发现kibana服务没起来,看了一下日志。

ElasticSearch(三)SpringBoot 整合ES

这种问题很常见。

ElasticSearch(三)SpringBoot 整合ES

可以看到我们之前的容器还占着。网上有好多教程,哈哈哈哈我打算避其锋芒,改端口。

ElasticSearch(三)SpringBoot 整合ES

ElasticSearch(三)SpringBoot 整合ES
清一下缓存
docker system prune

至此更新完成。

与SpringBoot整合

官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-getting-started-maven.html

导入依赖


        1.8
        7.17.3

    org.elasticsearch.client
    elasticsearch-rest-high-level-client
    7.17.3

编写配置

官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-getting-started-initialization.html

给容器中注入一个RestHighLevelClient。

@Configuration
public class EsClientConfig {

    @Bean
    public RestHighLevelClient RestHighLevelClient() {

        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("192.168.1.115", 9200, "http")
                ));
        return client;
    }
}

测试

如果有报错”datasource”,在启动类上添加: @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

@SpringBootTest
public class EsclientApplicationTests {
    @Autowired
    RestHighLevelClient client;

    @Test
    public void test1() {
        System.out.println(client);
    }

}

ElasticSearch(三)SpringBoot 整合ES

测试增删改查的操作

官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-document-index.html#java-rest-high-document-index-request

package com.uin.esclient;

@SpringBootTest
public class EsclientApplicationTests {
    @Autowired
    RestHighLevelClient client;

    @Test
    public void test1() {
        System.out.println(client);
    }

    /**
     * index Api
     */
    @Test
    public void test_index() throws IOException {
        //设置索引的名字
        IndexRequest indexRequest = new IndexRequest("users");
        //添加数据
        indexRequest.id("1");
        //indexRequest.source("username","uin","age","18","gender","男");

        //将User对象转化为JSON数据
        User user = new User();
        user.setUsername("uin");
        user.setGender("男");
        user.setAge(22);
        String s = JSON.toJSONString(user);

        indexRequest.source(s, XContentType.JSON);

        //执行保存数据分为:同步保存和异步保存

        IndexResponse index = client.index(indexRequest, EsClientConfig.COMMON_OPTIONS);
        //提取响应的数据
        System.out.println(index);

    }

    @Data
    class User {
        private String username;
        private String gender;
        private Integer age;
    }

    @Test
    public void test_search() throws IOException {
        //1.创建检索请求
        SearchRequest searchRequest = new SearchRequest();
        //2.指定要检索的索引
        searchRequest.indices("bank");
        //3.构建检索条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        //检索的条件
        builder.query(QueryBuilders.matchQuery("address", "mill"));
        //对年龄进行聚合
        TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg")
                .field("age").size(10);
        builder.aggregation(ageAgg);
        //求出这些年龄分布的平均工资
        AvgAggregationBuilder banlanceAvg = AggregationBuilders.avg("banlanceAvg").field(
                "balance");
        builder.aggregation(banlanceAvg);
        //builder.from();
        //builder.size();
        //builder.sort();
        System.out.println("检索条件" + builder);

        //4.执行检索
        SearchResponse search = client.search(searchRequest, EsClientConfig.COMMON_OPTIONS);
        System.out.println(search.toString());

        //5.分析结果 将json数据转换成对象
        //获取所有命中到的数据
        SearchHits hits1 = search.getHits();
        //System.out.println(hits1);
        SearchHit[] hits = hits1.getHits();

        for (SearchHit hit : hits) {
            //Map asMap = hit.getSourceAsMap();
            String sourceAsString = hit.getSourceAsString();
            JsonRootBean bean = JSON.parseObject(sourceAsString, JsonRootBean.class);
            System.out.println("检索出来的对象:" + bean);
            //System.out.println(sourceAsString);
        }
        //Map map = JSON.parseObject(String.valueOf(search), Map.class);

        //6.获取分析之后的数据
        Aggregations aggregations = search.getAggregations();
        //aggregations.asList().forEach(aggregation -> System.out.println("当前聚合的名字" + aggregation
        // .getName()));
        Terms ageAgg1 = aggregations.get("ageAgg");
        if (ageAgg1!=null){
//            ageAgg1.getBuckets().forEach((Consumer) bucket -> {
//                String keyAsString = bucket.getKeyAsString();
//                System.out.println("年龄:" + keyAsString);
//            });
            for (Terms.Bucket bucket:ageAgg1.getBuckets()){
                String keyAsString = bucket.getKeyAsString();
                System.out.println("年龄:" + keyAsString);
            }
        }

        Avg banlanceAvg1 = aggregations.get("banlanceAvg");
        System.out.println("平均薪资:"+banlanceAvg1.getValue());
    }

}

Original: https://www.cnblogs.com/bearbrick0/p/16222909.html
Author: BearBrick0
Title: ElasticSearch(三)SpringBoot 整合ES

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/572444/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 〖Java〗Eclispe安装和使用viplugin

    习惯了VIM的操作,每次打开Eclipse都习惯性的按下 hjkl; 感觉蛋疼了使用一下VIPlugin,发现给编码速度造成了成吨的伤害~ 这个插件对于习惯于使用VIM的程序员来说…

    Java 2023年5月29日
    060
  • Java Excel 文件导出导入

    1 import com.fasterxml.jackson.databind.exc.InvalidFormatException; 2 import com.sensetime…

    Java 2023年5月29日
    056
  • Java核心技术-泛型、集合

    Day10 泛型程序设计 对于Java泛型的转换需要记住一下几个事实: 虚拟机中没有泛型,只有普通的类和方法 所有的类型参数都会替换为他们的限定类型 会合成桥方法来保持多态 为保持…

    Java 2023年6月5日
    078
  • Spring boot中Yml文件的坑

    1、YML配置文件中的值如果是纯数字的话,中间不能使用 “_” 比如配置下面的值: 在项目中注入后的值会变为:2020081801 会默认去掉中间的&#82…

    Java 2023年5月30日
    076
  • 类加载机制深度解析

    多个java文件经过编译打包生成可运行jar包,最终由java命令运行某个主类的main启动程序,这里需要先通过类加载器把主类加载到JVM 主类在运行过程中如果使用到其他类,会逐步…

    Java 2023年6月13日
    063
  • 力扣刷题之路—–数组的遍历

    参考刷题顺序:力扣刷题顺序 本文章做自我总结,总结做题时自己的想法以及官方解题思路。 涉及题目 485 最大连续 1 的个数 495 提莫攻击 414 第三大的数 628 三个数的…

    Java 2023年6月5日
    086
  • nginx 转发接口出现 403 forbidden

    当你尝试完网上解决nginx 403 forbidden 的方法后仍然出现访问后台接口403的问题 不妨把问题定位到服务器和程序服务上 通过定位程序日志 发现在启动的时候日志报 n…

    Java 2023年5月30日
    070
  • volatile 关键字的 用法

    volatile关键字 什么是可见性? 可见性是指线程A改变变量的值后,线程B可以马上看到更改后变量的值 volatile的作用 关键字volatile提示线程每次从共享内存中读取…

    Java 2023年6月5日
    084
  • Sharepoint 2013 安装部署系列篇 第二篇 — SQL集群安装

    第一部分 系统集群安装 . 第三部分 安装和配置网络负载均衡在前端web服务器 第四部分 安装和配置sharepoint 场(三层拓扑部署) 以下图片均为sharepoint 20…

    Java 2023年6月7日
    075
  • ruoyi-plus-server(一):引入Mybatis-Plus

    四、project目录下新建demo模块 1、数据库脚本 2、目录结构 ①Demo ②DemoMapper ③DemoService ④DemoServiceImpl ⑤DemoC…

    Java 2023年6月8日
    054
  • 设计模式学习笔记(二十一)访问者模式及其实现

    访问者模式(Visitor Pattern)指将作用域某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作。借用《Jav…

    Java 2023年6月6日
    071
  • 点击按钮收藏

    后台代码 RouteServlet类: FavoriteService接口: FavoriteServiceImpl实现类: FavoriteDao接口: FavoriteDaoI…

    Java 2023年6月6日
    044
  • Java入门

    Java特性和优势 简单性 面向对象 可移植性(最重要的优势)write once, run anywhere 高性能 分布式 动态性 多线程 安全性 健壮性 Java三大版本 J…

    Java 2023年6月6日
    081
  • 记录下在阿里云linux上安装与配置Mysql

    环境:阿里云ECS服务器,系统为centos7.2 用户:root 参考博客: https://blog.csdn.net/kunzai6/article/details/8193…

    Java 2023年6月14日
    087
  • java实现简易的局域网对话系统

    先说一下 写的确实比较一般,别喷 为什么呢,疫情原因,学校提前两周期末考试,时间也不太充足,将就一下 服务器代码: package xcvcvcx; import java.io….

    Java 2023年6月5日
    063
  • 互联网技术部门该如何管理

    一、敏捷开发 1.快速开发、快速迭代。 2.组件式开发,避免重复造轮子。 3.制定代码标准。 4.并行开发,高效配合。 5.单元测试必须覆盖所有核心业务。 二、DevOps流程建立…

    Java 2023年6月16日
    081
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球