springboot整合elasticsearch时遇到的一些坑

springboot整合elasticsearch时遇到的一些坑

目前常用的方式有restclient,transport client和spring-data-elasticsearch。具体使用可以看下面博客
整合elasticsearch

一开始找到的用法是spring-data-elasticsearch,他的用法和mybatis类似,在model层使用Document注解映射es,然后使用继承ElasticsearchRepository操作实例对象,这方法的缺点在于与es操作对象与model紧耦合,同时es客户端如果有账号密码是无法连接的。

后来发现账号密码的问题可以使用transport client解决,不过了解到高版本不被支持,官方推荐rest high level client,官方文档点这里。下面是客户端的初始化,这里通过value注解从配置文件读取账号密码以及es地址

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.client.config.RequestConfig;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;



@Component
public class EsClient {

    @Value("${elasticsearch.username}")
    String username;

    @Value("${elasticsearch.password}")
    String password;

    @Value("${elasticsearch.hosts}")
    String hosts;

    @Bean
    private  RestHighLevelClient init(){
        String[] hostsArray = hosts.replace(" ", "").split(",");
        HttpHost[] httpHosts = new HttpHost[hostsArray.length];
        for (int i = 0; i < hostsArray.length; i++){
            String[] host = hostsArray[i].split(":");
            httpHosts[i] = new HttpHost(host[0], Integer.valueOf(host[1]), "http");
        }

        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
        RestClientBuilder builder = RestClient.builder(httpHosts).setRequestConfigCallback(
                new RestClientBuilder.RequestConfigCallback() {
                    @Override
                    public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
                        requestConfigBuilder.setConnectTimeout(-1);
                        requestConfigBuilder.setSocketTimeout(-1);
                        requestConfigBuilder.setConnectionRequestTimeout(-1);
                        return requestConfigBuilder;
                    }
                }).setHttpClientConfigCallback(
                new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                        httpClientBuilder.disableAuthCaching();
                        return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                }).setMaxRetryTimeoutMillis(5 * 60 * 1000);

        return new RestHighLevelClient(builder);
    }
}

在这里使用bean注解保证了RestHighLevelClient是单例的,同时其他文件使用只需要autowired声明就行

@Autowired
RestHighLevelClient client;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值