本文基于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地址添加到白名单中,而非客户端机器的内网地址。建议您通过浏览器访问cip.cc获取您当前使用的公网IP地址。
您也可以将白名单配置为0.0.0.0/0,允许所有IPv4地址访问阿里云Elasticsearch实例。此配置会导致实例完全暴露在公网中,增加安全风险,配置前请确认您是否可以接受这个风险。
如果未配置白名单或白名单配置错误,系统会提示连接超时报错(Timeout connecting)。
如果您需要通过客户端访问Kibana节点,还需要配置Kibana的访问白名单,详细信息请参见配置Kibana公网或私网访问白名单。
如果运行Java代码的服务器与阿里云Elasticsearch实例在同一专有网络VPC(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实例的私网或外网地址。可在实例的基本信息页面获取,获取方法请参见查看实例的基本信息。 |