本文基於Java Low Level REST Client 5.x版本,為您介紹Elasticsearch Java API的用法。
注意事項
本文提供的Low Level REST Client樣本主要適用於Elasticsearch 5.5.3版本,不適用於6.3.2版本。如果您的Elasticsearch執行個體是6.3.2版本,可參見Elasticsearch Java REST Client 6.3.2官方文檔進行配置。
Java REST Client版本需要與Elasticsearch執行個體版本保持一致。
準備工作
安裝Java,要求JDK版本為1.8及以上。
安裝方法請參見安裝JDK。
建立Elasticsearch執行個體,版本為5.5.3。
建立方法請參見建立Elasticsearch執行個體。
開啟Elasticsearch執行個體的自動建立索引功能。
具體操作步驟請參見配置YML參數。
如果未開啟會提示如下報錯。
配置Elasticsearch執行個體的白名單,確保網路互連。
如果運行Java代碼的伺服器在公網環境下,可通過Elasticsearch執行個體的公網地址進行連通。連通前,需要開啟Elasticsearch執行個體的公網地址,並修改公網地址訪問白名單,將伺服器的公網IP地址加入白名單中。具體操作步驟請參見配置執行個體公網或私網訪問白名單。
重要如果您的用戶端處在家用網路或公司區域網路中,您需要將區域網路的公網出口IP地址添加到白名單中,而非用戶端機器的內網地址。
您也可以將白名單配置為0.0.0.0/0,允許所有IPv4地址訪問Elasticsearch執行個體。此配置會導致執行個體完全暴露在公網中,增加安全風險,配置前請確認您是否可以接受這個風險。
如果未配置白名單或白名單配置錯誤,系統會提示連線逾時報錯(Timeout connecting)。
如果您需要通過用戶端訪問Kibana節點,還需要配置Kibana的訪問白名單,詳細資料請參見配置Kibana公網或私網訪問白名單。
如果運行Java代碼的伺服器與Elasticsearch執行個體在同一Virtual Private Cloud(Virtual Private Cloud)中,可通過Elasticsearch執行個體的私網地址進行連通。連通前,需要確保VPC私網訪問白名單(預設為0.0.0.0/0)中已添加了伺服器的內網IP地址。
建立Java Maven工程,並將下文的pom依賴添加到Java工程的pom.xml檔案中。
pom依賴
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>rest</artifactId>
<version>5.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7.1</version>
</dependency>
Log4j可能存在遠程代碼執行漏洞,詳細資料請參見漏洞公告 | Apache Log4j2遠程代碼執行漏洞。
樣本
單擊下載完整範例程式碼。
通過Java REST Client訪問Elasticsearch的9200連接埠進行測試,範例程式碼如下。
import org.apache.http.HttpEntity;
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.entity.ContentType;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.nio.entity.NStringEntity;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import java.io.IOException;
import java.util.Collections;
public class RestClientTest55 {
public static void main(String[]args){
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials("USER NAME", "PASSWORD"));
// 單擊所建立的Elasticsearch執行個體ID,在基本資料頁面擷取公網地址,即為HOST。
RestClient restClient = RestClient.builder(new HttpHost("HOST", 9200))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
}).build();
try {
//field_01、field_02為欄位名,value_01、value_02為對應的值。
HttpEntity entity = new NStringEntity("{\n\"field_01\" : \"value_01\"\n,\n\"field_02\" : \"value_02\"\n}", ContentType.APPLICATION_JSON);
//index_name為索引名稱;type_name為類型名稱;doc_id為文檔的id。
Response indexResponse = restClient.performRequest(
"PUT",
"/index_name/type_name/doc_id",
Collections.<String, String>emptyMap(),
entity);
//index_name為索引名稱;type_name為類型名稱;doc_id為文檔的id。與以上建立索引的名稱和id相同。
Response response = restClient.performRequest("GET", "/index_name/type_name/doc_id",
Collections.singletonMap("pretty", "true"));
System.out.println(EntityUtils.toString(response.getEntity()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
參數 | 說明 |
| 替換為訪問Elasticsearch執行個體的使用者名稱。 |
| 替換為訪問Elasticsearch執行個體的密碼。 |
| 替換為Elasticsearch執行個體的私網或外網地址。可在執行個體的基本資料頁面擷取,擷取方法請參見查看執行個體的基本資料。 |