This topic describes how to use Transport Client 5.3.3 to access an Alibaba Cloud Elasticsearch V5.X cluster.
Precautions
We recommend that you use Transport Client 5.3.3 to access Elasticsearch clusters. If you use Transport Client 5.5 or 5.6 to access an Elasticsearch cluster, the error message "NoNodeAvailableException" is displayed.
Transport Client communicates with an Elasticsearch cluster over TCP. If Transport Client communicates with an Elasticsearch cluster of a version that does not match the version of Transport Client, incompatibility issues may occur. In later versions of open source Elasticsearch, Transport Client is deprecated. We recommended that you use Java Low Level REST Client to access Elasticsearch clusters to ensure version compatibility.
Preparations
Install a JDK. The JDK version must be 1.8 or later.
For more information, see Install a JDK.
Create an Alibaba Cloud Elasticsearch V5.5.3 cluster.
For more information, see Create an Alibaba Cloud Elasticsearch cluster.
Enable the Auto Indexing feature for the Elasticsearch cluster.
For more information, see Configure the YML file.
If the Auto Indexing feature is not enabled, the following error is reported.
Configure an IP address whitelist for the Elasticsearch cluster to ensure normal communication among networks.
If the server that runs Java code is located in an Internet environment, you can access the cluster by using its public endpoint. Before you access the cluster, you must enable the Public Network Access feature for the cluster and add the public IP address of the server to a public IP address whitelist of the cluster. For more information, see Configure a public or private IP address whitelist for an Elasticsearch cluster.
ImportantIf your client is in a home network or in a LAN of an office, you must add the IP address of the Internet egress to the whitelist rather than the private IP address of the client.
You can also add 0.0.0.0/0 to the whitelist to allow requests from all IPv4 addresses. If you make this configuration, all public IP addresses can be used to access the cluster. This poses security risks. We recommend that you evaluate the risks before you make this configuration.
If no IP address whitelist is configured or the IP address whitelist is incorrectly configured, the system reports the "Timeout connecting" error message to indicate a connection timeout error.
If you want to access the Kibana node in your cluster from a client, you must configure an IP address whitelist for Kibana. For more information, see Configure a public or private IP address whitelist for Kibana.
If the server that runs Java code is located in the same virtual private cloud (VPC) as the Elasticsearch cluster, you can access the cluster by using its internal endpoint. Before you access the cluster, make sure that the private IP address of the server is added to a private IP address whitelist of the cluster. By default, 0.0.0.0/0 is added to the whitelist.
Create a Java Maven project and add the following Project Object Model (POM) dependencies to the pom.xml file of the project.
POM dependencies
<repositories>
<!-- add the elasticsearch repo -->
<repository>
<id>elasticsearch-releases</id>
<url>https://artifacts.elastic.co/maven</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>x-pack-transport</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7.1</version>
</dependency>
</dependencies>
A remote code execution (RCE) vulnerability may exist in Apache Log4j. For more information, see Vulnerability notice | RCE vulnerability in Apache Log4j 2.
Example
You can download the complete sample code.
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
import static org.elasticsearch.common.xcontent.XContentFactory.*;
import java.net.InetAddress;
public class TransportClientDemo {
public static void main(String[] args) {
try {
TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
.put("cluster.name", "es-cn-n6w1rux8i000w****") // Set the value to the ID of the Elasticsearch cluster.
.put("xpack.security.user", "elastic:es_password") // Set the value to the username and password that are used to access the Elasticsearch cluster.
. put("client.transport.sniff", false) // Set the value to false.
.build())
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("es-cn-n6w1rux8i000w****.public.elasticsearch.aliyuncs.com"), 9300));// Specify the endpoint and port number that are used to access the Elasticsearch cluster.
// You can modify the following code based on your business requirements. For example, you can change the index name, index type, and document ID.
IndexResponse idxResp3 = client.prepareIndex("test_index", "test_type", "333")
.setSource(jsonBuilder()
.startObject()
.field("user_id", "333")
.field("email", "a***@aliyun.com")
.endObject()
)
.get();
System.out.println(idxResp3.toString());
GetResponse getResp =
client.prepareGet().setIndex("test_index").setType("test_type").setId("333").execute().get();
System.out.println(getResp.getSourceAsString());
client.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
Parameter | Description |
cluster.name | Set the value to the ID of the Elasticsearch cluster. You can obtain the ID from the Basic Information page of the cluster. For more information, see View the basic information of a cluster. |
client.transport.sniff | Set the value to false. |
xpack.security.user | Set the value to the username and password that are used to access the Elasticsearch cluster. The default username is elastic. The password is specified when you create the cluster. If you forget the password, you can reset it. For more information about the procedure and precautions for resetting a password, see Reset the access password for an Elasticsearch cluster. |
InetAddress.getByName() | Specify the endpoint and port number that are used to access the Elasticsearch cluster. Important The endpoint cannot start with http. |