Elasticsearch(ES)有兩種鏈接方式:transport、rest。transport經過TCP方式訪問ES(只支持java),rest方式經過http API 訪問ES(沒有語言限制)。html
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
複製代碼
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
Settings settings = Settings.builder()
.put("cluster.name", "myClusterName")
.put("client.transport.sniff", true)
.build();
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300));
複製代碼
設置client.transport.sniff爲true來使客戶端去嗅探整個集羣的狀態,把集羣中其它機器的ip地址加到客戶端中,這樣作的好處是通常你不用手動設置集羣裏全部集羣的ip到鏈接客戶端,它會自動幫你添加,而且自動發現新加入集羣的機器。java
官方提供low-level rest client(支持5.0及之後版本) 和high-level rest client(支持版本爲 5.6及之後版本)bash
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>6.5.4</version>
</dependency>
複製代碼
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>rest</artifactId>
<version>5.3.2</version>
</dependency>
複製代碼
Header[] defaultHeaders = new Header[] { new BasicHeader("header", "value") };
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http"))
.setDefaultHeaders(defaultHeaders) //設置默認標頭
.setMaxRetryTimeoutMillis(10000) //同一請求重試超時時間,默認30s
.setFailureListener(new RestClient.FailureListener() {
}) //設置偵聽器,節點出現故障會收到通知
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
//create the authentication scope
AuthScope authScope = new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope
.ANY_REALM);
// Create credential pair(username,password)
UsernamePasswordCredentials usernamePasswordCredentials = new UsernamePasswordCredentials("username", "password");
credentialsProvider.setCredentials(authScope, usernamePasswordCredentials);
return httpClientBuilder.setKeepAliveStrategy(new ConnectionKeepAliveStrategy() {
@Override
public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
return 30 * 1000;
}
}).setDefaultCredentialsProvider(credentialsProvider);
}
})
.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
@Override
public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
return requestConfigBuilder.setSocketTimeout(10000);
}
})
.build();
複製代碼
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>rest</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
複製代碼
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
複製代碼