springboot集成elasticsearch 7.x 以上

380 阅读1分钟

引入依赖

<dependency>
    <groupId>co.elastic.clients</groupId>
    <artifactId>elasticsearch-java</artifactId>
    <version>${elasticsearch.version}</version>
</dependency>

这里填已经安装好的elasticsearch对应的版本

elasticsearch 配置

@Configuration
public class ElasticSearchConfig {
    // 这些属性自己在application.yml中配置
    /** 协议 */
    @Value("${elasticsearch.schema:http}")
    private String schema;

    /** elasticsearch地址,未设置集群 */
    @Value("${elasticsearch.address}")
    private String address;

    /** 端口 */
    @Value("${elasticsearch.port}")
    private String port;

    /**
     * 自定义的连接设置类
     */
    private ElasticsearchRequestConfigCallback configCallback;

    @Autowired
    public void setConfigCallback(ElasticsearchRequestConfigCallback configCallback) {
        this.configCallback = configCallback;
    }
    // 将ElasticsearchClient注册到spring容器中,方便在其他地方直接注入使用
    @Bean
    public ElasticsearchClient elasticsearchClient() {
        // 构造方法 HttpHost(String hostname, int port, String scheme)
        HttpHost httpHost = new HttpHost(address, Integer.parseInt(port), schema);
        // 构造方法 RestClientBuilder builder(HttpHost... hosts)
        // 连接elasticsearch客户端
        RestClient restClient;
        restClient = RestClient.builder(httpHost).setRequestConfigCallback(configCallback).build();
        // 设置json mapper 映射类
        ElasticsearchTransport transport = new RestClientTransport(
                restClient, new JacksonJsonpMapper());
        return new ElasticsearchClient(transport);
    }

}

自定义连接的属性值

在RestClient.builder()方法中,RestClient提供了setRequestConfigCallback方法,查看RequestConfigCallback发现是一个接口,我们直接实现这个接口。

public interface RequestConfigCallback {
    /**
     * Allows to customize the {@link RequestConfig} that will be used with each request.
     * It is common to customize the different timeout values through this method without losing any other useful default
     * value that the {@link RestClientBuilder} internally sets.
     */
    RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder);
}

在这个接口中只有一个方法customizeRequestConfig,意思就是定制request配置,所以通过这个实现这个方法,可以定制我们想要的连接属性。

@Component
public class ElasticsearchRequestConfigCallback implements RestClientBuilder.RequestConfigCallback {
    // 这些属性自己在application.yml中配置
    /** 连接超时时间 */
    @Value("${elasticsearch.connectTimeout:5000}")
    private int connectTimeout;

    /** Socket 连接超时时间 */
    @Value("${elasticsearch.socketTimeout:10000}")
    private int socketTimeout;

    /** 获取连接的超时时间 */
    @Value("${elasticsearch.connectionRequestTimeout:5000}")
    private int connectionRequestTimeout;

    /** 最大连接数 */
    @Value("${elasticsearch.maxConnectNum}")
    private int maxConnectNum;

    @Override
    public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
        // 通过RequestConfig.Builder这个类,我们可以自己设置连接的一些属性,达到定制配置的效果
        requestConfigBuilder.setConnectionRequestTimeout(connectTimeout)
                .setSocketTimeout(socketTimeout)
                .setConnectionRequestTimeout(connectionRequestTimeout)
                .setMaxRedirects(maxConnectNum);
        return requestConfigBuilder;
    }
}

浅看一下RequestConfig.Builder 这个类,发现它已经初始化了所有的属性,我们也可以通过设置来进行修改。

Builder() {
    super();
    this.staleConnectionCheckEnabled = false;
    this.redirectsEnabled = true;
    this.maxRedirects = 50;
    this.relativeRedirectsAllowed = true;
    this.authenticationEnabled = true;
    this.connectionRequestTimeout = -1;
    this.connectTimeout = -1;
    this.socketTimeout = -1;
    this.contentCompressionEnabled = true;
    this.normalizeUri = true;
}

最后可以通过自动注入的方式来使用ElasticsearchClient这个类,旧版的RestHighLevelClient这种方法官方已经弃用了。

private ElasticsearchClient client;
@Autowired
public void setClient(ElasticsearchClient client) {
    this.client = client;
}