SpringBoot3.01 + ElasticSearch(阿里云的免费试用版) 简单实现

901 阅读1分钟

参考 : juejin.cn/post/717985…

一、安装ElasticSearch

1、阿里云申请试用版本的ElasticSearch【7.10.0】(需要花钱1块钱),使用时间1个月。

版本说明

docs.spring.io/spring-data…

2、自己百度安装一个本地版本,我真的不喜欢运维事情【我太废材,无法快速部署】。

二、ElasticSearch,jar包

在pom.xml里加入如下依赖

<spring.boot.version>3.0.1</spring.boot.version>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    <version>${spring.boot.version}</version>
</dependency>

以下例子使用版本:

jar版本
elasticsearch7.17.7
spring boot3.0.1
java17

三、客户端定义

package com.nice.framework.config;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.Header;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.message.BasicHeader;
import org.elasticsearch.client.RestClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @description: ElasticSearch
 * @author: nice
 * @created: 2022/12/29 10:13
 */
@Configuration
public class ElasticSearchClientConfig {

    public final String username = "elastic";
    public final String password = "########";

    public final String hostname = "es-cn-tl330texc001lmavp.public.elasticsearch.aliyuncs.com";

    public final Integer port = 9200;    // 默认端口号

    public final String scheme = "http";  // 协议

    @Bean
    public RestClient getRestClient() {
        // 创建用户名密码认证
        final CredentialsProvider credentialsProvider =
                new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(username, password));

        Header[] defaultHeaders = new Header[]{new BasicHeader("Content-Type", "application/json")};
        // Header[] defaultHeaders = new Header[]{new BasicHeader("Content-Type", "application/x-www-form-urlencoded")};

        // 使用 low level rest client 进行连接和认证
        return RestClient.builder(
                new HttpHost(hostname, port, scheme)
        ).setHttpClientConfigCallback(httpAsyncClientBuilder ->
                httpAsyncClientBuilder.setDefaultCredentialsProvider(
                        credentialsProvider)
        ).setDefaultHeaders(defaultHeaders)
         .build();
    }

    @Bean
    public ElasticsearchTransport getElasticsearchTransport() {
        // 使用 transport 加载 json 的对象映射器
        return new RestClientTransport(getRestClient(),
                new JacksonJsonpMapper());
    }

    @Bean
    public ElasticsearchClient getElasticsearchClient() {
        // 创建操作用的 ElasticsearchClient 对象
        return new ElasticsearchClient(getElasticsearchTransport());
    }
}

四、基本用法:

@Autowired
private ElasticsearchClient elasticsearchClient;


@GetMapping
public AjaxResult testCreateIndex() throws IOException {
    //1.创建索引请求
    CreateIndexResponse re = elasticsearchClient.indices()
            .create(item -> item.index("nice-001"));
    String str = String.valueOf(re.acknowledged());
    return AjaxResult
            .success(str);
}

异常2: [es/indices.create] failed: [resource_already_exists_exception] index [nice-0011/M6XTHvKJRIyvEGn3xymSBQ] already exists

原因:重复添加索引。

异常1: [es/indices.create] Missing [X-Elastic-Product] header. Please check that you are connecting to an Elasticsearch instance, and that any networking filters are preserving that header.

说明: 虽然异常,但是索引已经添加到es内。

等下阿里云出8.0+ 版本在继续demo