High Level REST Client(6.3.x)
本文基于Java High Level REST Client 6.3.x版本,為您介紹Elasticsearch Java API的用法。
準(zhǔn)備工作
安裝Java,要求JDK版本為1.8及以上。
安裝方法請參見安裝JDK。
創(chuàng)建阿里云Elasticsearch實(shí)例,版本要求大于等于Java High Level REST Client的版本。
本文創(chuàng)建一個(gè)6.3.2版本的實(shí)例,創(chuàng)建方法請參見創(chuàng)建阿里云Elasticsearch實(shí)例。
重要High Level Client能夠向上兼容,例如6.3.2版本的Java High Level REST Client能確保與大于等于6.3.2版本的Elasticsearch集群通信。為了保證最大程度地使用新版客戶端的特性,推薦High Level Client版本與集群版本一致。
開啟阿里云Elasticsearch實(shí)例的自動(dòng)創(chuàng)建索引功能。
具體操作步驟請參見配置YML參數(shù)。
如果未開啟會(huì)提示如下報(bào)錯(cuò)。
配置阿里云Elasticsearch實(shí)例的白名單,確保網(wǎng)絡(luò)互通。
如果運(yùn)行Java代碼的服務(wù)器在公網(wǎng)環(huán)境下,可通過阿里云Elasticsearch實(shí)例的公網(wǎng)地址進(jìn)行連通。連通前,需要開啟阿里云Elasticsearch實(shí)例的公網(wǎng)地址,并修改公網(wǎng)地址訪問白名單,將服務(wù)器的公網(wǎng)IP地址加入白名單中。具體操作步驟請參見配置實(shí)例公網(wǎng)或私網(wǎng)訪問白名單。
重要如果您的客戶端處在家庭網(wǎng)絡(luò)或公司局域網(wǎng)中,您需要將局域網(wǎng)的公網(wǎng)出口IP地址添加到白名單中,而非客戶端機(jī)器的內(nèi)網(wǎng)機(jī)制。建議您通過瀏覽器訪問cip.cc獲取您當(dāng)前使用的公網(wǎng)IP地址。
您也可以將白名單配置為0.0.0.0/0,允許所有IPv4地址訪問阿里云Elasticsearch實(shí)例。此配置會(huì)導(dǎo)致實(shí)例完全暴露在公網(wǎng)中,增加安全風(fēng)險(xiǎn),配置前請確認(rèn)您是否可以接受這個(gè)風(fēng)險(xiǎn)。
如果未配置白名單或白名單配置錯(cuò)誤,系統(tǒng)會(huì)提示連接超時(shí)報(bào)錯(cuò)(Timeout connecting)。
如果您需要通過客戶端訪問Kibana節(jié)點(diǎn),還需要配置Kibana的訪問白名單,詳細(xì)信息請參見配置Kibana公網(wǎng)或私網(wǎng)訪問白名單。
如果運(yùn)行Java代碼的服務(wù)器與阿里云Elasticsearch實(shí)例在同一專有網(wǎng)絡(luò)VPC(Virtual Private Cloud)中,可通過阿里云Elasticsearch實(shí)例的私網(wǎng)地址進(jìn)行連通。連通前,需要確保VPC私網(wǎng)訪問白名單(默認(rèn)為0.0.0.0/0)中已添加了服務(wù)器的內(nèi)網(wǎng)IP地址。
創(chuàng)建Java Maven工程,并將如下的pom依賴添加到Java工程的pom.xml文件中。
pom依賴
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.3.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
Log4j可能存在遠(yuǎn)程代碼執(zhí)行漏洞,詳細(xì)信息請參見漏洞公告 | Apache Log4j2遠(yuǎn)程代碼執(zhí)行漏洞。
示例
單擊下載完整示例代碼。
以下示例使用Index API創(chuàng)建索引,然后使用Delete API刪除該索引。
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.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class RestClientTest63 {
public static void main(String[] args) {
// 阿里云Elasticsearch集群需要basic auth驗(yàn)證。
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
//訪問用戶名和密碼為您創(chuàng)建阿里云Elasticsearch實(shí)例時(shí)設(shè)置的用戶名和密碼,也是Kibana控制臺(tái)的登錄用戶名和密碼。
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("{訪問用戶名}", "{訪問密碼}"));
// 通過builder創(chuàng)建rest client,配置http client的HttpClientConfigCallback。
// 單擊所創(chuàng)建的Elasticsearch實(shí)例ID,在基本信息頁面獲取公網(wǎng)地址,即為ES集群地址。
RestClientBuilder builder = RestClient.builder(new HttpHost("{ES集群地址}", 9200, "http"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
// RestHighLevelClient實(shí)例通過REST low-level client builder進(jìn)行構(gòu)造。
RestHighLevelClient highClient = new RestHighLevelClient(builder);
try {
// 創(chuàng)建request。
Map<String, Object> jsonMap = new HashMap<>();
// field_01、field_02為字段名,value_01、value_02為對應(yīng)的值。
jsonMap.put("{field_01}", "{value_01}");
jsonMap.put("{field_02}", "{value_02}");
//index_name為索引名稱;type_name為類型名稱;doc_id為文檔的id。
IndexRequest indexRequest = new IndexRequest("{index_name}", "{type_name}", "{doc_id}").source(jsonMap);
// 同步執(zhí)行。
IndexResponse indexResponse = highClient.index(indexRequest);
long version = indexResponse.getVersion();
System.out.println("Index document successfully! " + version);
//index_name為索引名稱;type_name為類型名稱;doc_id為文檔的id。與以上創(chuàng)建索引的名稱和id相同。
DeleteRequest request = new DeleteRequest("{index_name}", "{type_name}", "{doc_id}");
DeleteResponse deleteResponse = highClient.delete(request);
System.out.println("Delete document successfully!");
highClient.close();
} catch (IOException ioException) {
// 異常處理。
}
}
}
以上示例代碼中帶{}
的參數(shù)需要替換為您具體業(yè)務(wù)的參數(shù),詳情請參見代碼注釋。
更多Java High Level REST Client的使用特性,請參見Java High Level REST Client官方文檔。