首页 > 编程语言 >elasticsearch 8.7.0的Java API详解教程(一)

elasticsearch 8.7.0的Java API详解教程(一)

时间:2023-10-18 23:07:58浏览次数:45  
标签:Java 8.7 spring boot private API elasticsearch rest org

最近作者做一个es的搜索,之前采用的是7.12.1,本来接口都已经基本上写好了,后面es要升级到8.7.0,一升级就连接不上es8.7.0了,后面才发现原来es8是默认采用了HTTPS协议,需要配置认证证书,这个问题搞了好久好久,最后终于搞成功了,在此写一篇博客记录一下。

一、pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.tom</groupId>
    <artifactId>elasticsearch-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>elasticsearch-server</name>
    <description>elasticsearch-server</description>
    <properties>
        <java.version>17</java.version>
        <mybatis.version>2.2.0</mybatis.version>
        <hutool.version>5.7.16</hutool.version>
        <gson.version>2.8.6</gson.version>
        <guava.version>29.0-jre</guava.version>
        <druid.version>1.2.14</druid.version>
        <aspectj.version>1.9.4</aspectj.version>
        <retrofit.version>2.2.20</retrofit.version>
        <mybatis-plus.version>3.4.0</mybatis-plus.version>
        <commons-io.version>2.4</commons-io.version>
        <fastjson.version>1.2.73</fastjson.version>
        <springdoc.version>1.4.4</springdoc.version>
        <nimbus-jose-jwt.version>3.10</nimbus-jose-jwt.version>
        <javax-mail.version>1.4.7</javax-mail.version>
        <jbcrypt.version>0.4</jbcrypt.version>
    </properties>
    <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-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
        <!--swagger3-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
        <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

二、application配置文件

server:
  port: 10086
  servlet:
    context-path: /elasticsearch

spring:
  elasticsearch:
    rest:
      enable: true
      uris: 127.0.0.1:9200
      host: 127.0.0.1
      port: 9200
      username: elastic
      password: xxxxxxx
      index: indexName
      crtName: http_ca.crt


logging:
  level:
    root: debug

如何获取这个http_ca.crt证书文件呢,这个可以登录es访问地址,比如说https://127.0.0.1:9200,输入账号密码,就可以在浏览器上下载证书啦,下载之后需要将这个文件的名称修改为http_ca.crt并且放到resource目录下面

elasticsearch 8.7.0的Java API详解教程(一)_elasticsearch

elasticsearch 8.7.0的Java API详解教程(一)_spring_02

三、ElasticSearchConfig配置类

@Configuration
@Slf4j
public class ElasticSearchConfig {

    @Value("${spring.elasticsearch.rest.host}")
    private String host;
    @Value("${spring.elasticsearch.rest.enable}")
    private boolean enable;
    @Value("${spring.elasticsearch.rest.port}")
    private int port;
    @Value("${spring.elasticsearch.rest.username}")
    private String userName;
    @Value("${spring.elasticsearch.rest.password}")
    private String passWord;
    @Value("${spring.elasticsearch.rest.crtName}")
    private String tempCrtName;

    private static String crtName;

    @PostConstruct
    private void init() {
        crtName = tempCrtName;
    }

    /**
     * 解析配置的字符串,转为HttpHost对象数组
     *
     * @return
     */
    private HttpHost toHttpHost() {
        HttpHost httpHost = new HttpHost(host, port, "https");
        return httpHost;
    }

    @Bean
    public ElasticsearchClient clientByPasswd() throws Exception {
        ElasticsearchTransport transport = getElasticsearchTransport(userName, passWord, toHttpHost());
        return new ElasticsearchClient(transport);
    }

    private static SSLContext buildSSLContext() {
        ClassPathResource resource = new ClassPathResource(crtName);
        SSLContext sslContext = null;
        try {
            CertificateFactory factory = CertificateFactory.getInstance("X.509");
            Certificate trustedCa;
            try (InputStream is = resource.getInputStream()) {
                trustedCa = factory.generateCertificate(is);
            }
            KeyStore trustStore = KeyStore.getInstance("pkcs12");
            trustStore.load(null, null);
            trustStore.setCertificateEntry("ca", trustedCa);
            SSLContextBuilder sslContextBuilder = SSLContexts.custom()
                    .loadTrustMaterial(trustStore, null);
            sslContext = sslContextBuilder.build();
        } catch (CertificateException | IOException | KeyStoreException | NoSuchAlgorithmException |
                 KeyManagementException e) {
            log.error("ES连接认证失败", e);
        }

        return sslContext;
    }

    private static ElasticsearchTransport getElasticsearchTransport(String username, String passwd, HttpHost... hosts) {
        // 账号密码的配置
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, passwd));

        // 自签证书的设置,并且还包含了账号密码
        RestClientBuilder.HttpClientConfigCallback callback = httpAsyncClientBuilder -> httpAsyncClientBuilder
                .setSSLContext(buildSSLContext())
                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                .setDefaultCredentialsProvider(credentialsProvider);

        // 用builder创建RestClient对象
        RestClient client = RestClient
                .builder(hosts)
                .setHttpClientConfigCallback(callback)
                .build();
        return new RestClientTransport(client, new JacksonJsonpMapper());
    }

}

标签:Java,8.7,spring,boot,private,API,elasticsearch,rest,org
From: https://blog.51cto.com/u_14725510/7923207

相关文章

  • java学习_02.1
    数据类型1.基本数据类型整数类型byte,short,int,long浮点数类型float,double字符类型char布尔类型boolean注意//long//如果要定义long类型的变量//在数据值的后面需要加一个L作为后缀//L可以是大写的,也可以是小写的。......
  • Java拾贝第五天——内部类
    Java拾贝不建议作为0基础学习,都是本人想到什么写什么内部类在类中可以定义成员变量和方法,而且还可以定义一个类。一般内部类分为四种:成员内部类、局部内部类、静态内部类、匿名内部类。成员内部类成员内部类就好像成员变量一样,定义在类的内部。classOut{privateint......
  • 算法之空间复杂度以及评判算法的标准(Java)
    一:概述//例如:给出一些整数n:31254972,其中//有两个整数是重复的,要找出这两个重复地整数。//对于这个简单的需求,可以使用很多的思路类解决,其中最朴素的就是//双重循环//遍历整个数列,每遍历一个新的整数就开始回顾//之前遍历过的所有整数。//即第1步:遍历整数3,前面没有......
  • 23.10.18(常用Java异常处理情况整合)
    在JAVA项目中,异常处理是一项非常重要的任务。合理处理异常能够提高程序的稳定性和可靠性,保证程序的正常运行。下面是关于JAVA项目中常用的异常处理情况的总结:1.空指针异常(NullPointerException):在使用一个空对象的成员变量或方法时会抛出该异常。可以通过判断对象是否为空来避免......
  • javaweb第10章源码
    javaweb第10章源码下载链接:https://wwpv.lanzoue.com/iDhBE1c5hcxg文件结构CHAPTER10│.classpath│.project│chapter10.iml│├─.idea│encodings.xml│misc.xml│modules.xml│workspace.xml│├─.settings│.jsdtscope......
  • 23.10.18 Java当中的异常处理
    Java当中的异常处理在Java中,异常是指在程序执行期间发生的错误或异常情况,可以分为两种类型:受检异常(CheckedException)和非受检异常(UncheckedException)。受检异常:受检异常是指需要在代码中显式处理的异常,通常继承自Exception类的子类。例如,IOException和SQLException是受检异......
  • vue +asp.net core webapi跨域
              vue代码:  login.vue  <template>  <divclass="login-wrap">      <el-buttontype="primary"style="width:100%;"@click="doSubmit()">提交</el-button>      ......
  • 在JavaScript中,`!!`(不是not)操作符的作用是什么?
    内容来自DOChttps://q.houxu6.top/?s=在JavaScript中,!!(不是not)操作符的作用是什么?我看到了一些代码,似乎使用了我不知道的操作符,形式为两个感叹号,就像这样:!!。有人能告诉我这个操作符是做什么的吗?我看到这个操作符的上下文是:this.vertical=vertical!==undefined?!!ver......
  • 204 K8S API资源对象介绍03 (Job CronJob Endpoint ConfigMap Secret) 2.12-2.16
    一、API资源对象Job一次性运行后就退出的Pod1.1使用kubect生成YAML文件#kubectlcreatejobjob01--image=busybox--dry-run=client-oyaml>job01.yaml#vimjob01.yaml#catjob01.yamlapiVersion:batch/v1kind:Jobmetadata:creationTimestamp:nullnam......
  • javacv入门
    第一章:javacv介绍了解javacv的历史和发展背景JavaCV是一个开源的Java框架,它提供了基于Java的接口,用于访问各种计算机视觉库和工具包,如OpenCV、FFmpeg等。JavaCV旨在为Java开发人员提供快速、简单和可靠的图像和视频处理能力。JavaCV的历史可以追溯到2007年,当时一个名为“JavaCP......