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;