
# 通过TransportClient接入集群
在使用Elasticsearch进行数据查询和管理时，许多用户依赖于TransportClient这一早期Java客户端，它通过封装原生API简化了与Elasticsearch集群的交互过程。CSS服务的Elasticsearch集群支持通过TransportClient进行数据查询和管理，用户只需要构造对应的结构即可对Elasticsearch集群进行访问。
![](https://support.huaweicloud.com/usermanual-css/public_sys-resources/caution_3.0-zh-cn.png)
TransportClient已经在Elasticsearch 7.0版本中被标记为弃用状态。为了获得更好的兼容性和功能支持，建议优先使用Java High Level REST Client。
#### 前提条件
- Elasticsearch集群处于可用状态，而且是非安全模式的集群（TransportClient只支持用于访问非安全模式的集群）。
- 运行Java代码的服务器与Elasticsearch集群之间网络互通。
- 获取集群的内网访问地址，操作指导请参见[获取集群访问地址](https://support.huaweicloud.com/usermanual-css/css_01_0190.html#ZH-CN_TOPIC_0000001975823337__section855085010198)。由于TransportClient仅适用于访问非安全模式的集群，因此只能通过内网地址访问集群。
- 确认服务器已安装Java，要求JDK版本为1.8及以上，JDK1.8官网下载地址：[Java Downloads](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)。
- 确认TransportClient版本：为确保更好的兼容性，建议使用与Elasticsearch集群同版本的TransportClient连接Elasticsearch集群。
 
#### 引入依赖
在运行Java代码的服务器中引入Java依赖。通过Maven方式引入apache版本。
使用时需要将7.10.2替换为实际Java客户端的版本号。
```
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>7.10.2</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.10.2</version>
</dependency>
```
#### 接入集群
使用Elasticsearch TransportClient连接非安全模式的Elasticsearch集群，并查询索引"test"是否存在。代码示例如下：
```
import org.elasticsearch.action.ActionFuture;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.concurrent.ExecutionException;
public class Main {
    public static void main(String[] args) throws ExecutionException, InterruptedException, UnknownHostException {
        String cluster_name = "xxx";
        String host1 = "xx.xx.xx.xx";
        String host2 = "yy.yy.yy.yy";
        Settings settings = Settings.builder()
            .put("client.transport.sniff",false)
            .put("cluster.name", cluster_name)
            .build();
        TransportClient client = new PreBuiltTransportClient(settings)
            .addTransportAddress(new TransportAddress(InetAddress.getByName(host1), 9300))
            .addTransportAddress(new TransportAddress(InetAddress.getByName(host2), 9300));
        IndicesExistsRequest indicesExistsRequest = new IndicesExistsRequest("test");
        ActionFuture<IndicesExistsResponse> exists = client.admin().indices().exists(indicesExistsRequest);
        System.out.println(exists.get().isExists());
    }
}
```
其中，*cluster_name* 为集群的名称；*host1* 、*host2* 为集群节点的内网IP地址，可通过GET _cat/nodes命令查看节点的IP地址。
该示例代码为判断集群是否存在test索引，当返回"true"（索引存在）或"false"（索引不存在）时，表示正常返回查询结果，集群连接成功。
