ElasticSearch的javaAPI之Client

深入理解ElasticSearch Java API
本文详细介绍了ElasticSearch提供的Java API,包括如何通过Java客户端进行操作、配置及使用方法,强调了客户端操作的异步性和批量处理能力,同时提供了在实际应用中的多种使用场景和注意事项。

翻译的原文http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/client.html#node-client

翻译ElasticSearch的javaAPI之Client

本节描写叙述了elasticsearch提供的Java API,全部elasticsearch操作使用client对象运行。

全部的操作在本质上是全然asynchronous(接受一个listener,或返回一个future)。

此外,在client的操作,能够批量处理。

注意: all the APIs are exposed through the Java API 

 

maven repository

比如,你能够在pom.xml文件里增加以下这几行

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>${es.version}</version>
</dependency>

 

您能够以多种方式使用Java client:

        对一个现有的cluster中index,运行标准的get,delete和search操作

        在一个执行群集执行管理任务

        执行嵌入在您自己的应用程序的elasticsearch,或者当你想执行单元和集成測试,启动节点

获取一个elasticsearch client是easy的。以下最经常使用的方式:
     1.创建一个节点( acts as a node within a cluster
     2.从节点请求client(from your embedded Node)

还有一种方式是通过创建一个TransportClient连接到群集。

Important:

请注意,我们建议使用同一版本号的client和集群。由于你可能遇到一些不兼容的问题,当混用不同版本号。

Node client:

   实例化一个基于节点的client是最简单的方法,能够让客户对elasticsearch进行运行操作。

   importstatic org.elasticsearch.node.NodeBuilder.*;

// on startup

Node node = nodeBuilder().node();
Client client = node.client();

// on shutdown

node.close();

当你启动一个节点,它增加了一个elasticsearch集群。你能够通过简单的设置cluster.name设置不同的集群,或显式地使用clusterName method方法。

你能够定义cluster.name在/src/main/resources / elasticsearch.yml文件在您的项目。仅仅要elasticsearch.yml是在类路径中存在,它将被用来当您启动节点。

cluster.name: yourclustername

 Or in Java:

Node node = nodeBuilder().clusterName("yourclustername").node();
Client client = node.client();

使用client的优点是操作是自己主动路由到节点的操作须要运行,不运行“double hop”。比如,index操作将在shard上自己主动运行的。

当你启动一个节点,最重要的是决定是否应该保存数据或不。换句话说,该indices和shards被分配给它的。非常多时候我们会须要client不过client,没有shards分配给他们。这是简单的设置是node.data设置为false或node.client的配置true(the NodeBuilder respectivehelper methods on it):

importstatic org.elasticsearch.node.NodeBuilder.*;

// on startup

Node node = nodeBuilder().client(true).node();
Client client = node.client();

// on shutdown

node.close();

还有一个常见方法启动节点和使用client单元/集成測试。在这样的情况下,我们要開始一个“local”节点(与“local”的discovery and transpor)。再次,这仅仅是一个简单的设置启动节点时。注意,“local”在这里是指当地的JVM(嗯,实际上的类装载器),这意味着两个本地server开在同样的JVM,组成一个集群。

importstatic org.elasticsearch.node.NodeBuilder.*;

// on startup

Node node = nodeBuilder().local(true).node();
Client client = node.client();

// on shutdown

node.close();

 

transport  client

TransportClient 使用 transport module远程连接elasticsearch集群,它不增加群集,但仅仅会有一个或多个初始传输地址和与集群交流对每一个动作robin fashion(尽管大多数行动将可能是“two hop”操作)。

// on startup

Client client = new TransportClient()
        .addTransportAddress(new InetSocketTransportAddress("host1", 9300))
        .addTransportAddress(new InetSocketTransportAddress("host2", 9300));

// on shutdown

client.close();

请注意,你必须设置群集名称,假设你使用一个不同的“elasticsearch”:

Settings settings =ImmutableSettings.settingsBuilder()
        .put("cluster.name", "myClusterName").build();
Client client =    new TransportClient(settings);
//Add transport addresses and do something with the client...

或者使用elasticsearch.yml 

客户能够sniff集群的歇息,并加入到列表中的机器使用。在这样的情况下,请注意,使用的IP地址将是其它节点開始的("publish" address)。为了使用它,把client.transport.sniff设置true:

Settings settings =ImmutableSettings.settingsBuilder()
        .put("client.transport.sniff", true).build();
TransportClient client = new TransportClient(settings);

Other transport client levelsettings include:

client.transport.ignore_cluster_name

Set to true to ignore cluster name validation of connected nodes. (since 0.19.4)

client.transport.ping_timeout

The time to wait for a ping response from a node. Defaults to 5s.

client.transport.nodes_sampler_interval

How often to sample / ping the nodes listed and connected. Defaults to 5s.

 

 

原文:http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/client.html#node-client

翻译欠佳,希望不会对大家造成误导


<think> 我们正在讨论Elasticsearch Java API Client是否需要关闭的问题。根据之前的引用资料和一般的最佳实践,客户端连接资源确实需要正确关闭,以避免资源泄漏。 引用[1]中提到,高级客户端(Java High Level REST Client)基于低级客户端(Java Low Level REST Client),它负责请求的编排和响应的反编排。虽然引用中没有直接提到关闭,但通常这样的客户端会持有网络连接等资源,需要关闭。 引用[2]中明确提到了TransportClient,并指出它使用Netty线程池和Socket连接,因此需要关闭。虽然我们讨论的是新的Java API Client(不是TransportClient),但原理相似,因为任何网络客户端都需要管理连接资源。 引用[4]中的示例代码展示了TransportClient的使用,其中显式调用了`client.close()`。这进一步印证了关闭客户端的重要性。 因此,我们可以得出结论:Elasticsearch Java API Client需要关闭。具体来说,当我们使用完ElasticsearchClient后,应该调用其close方法,或者使用try-with-resources语句(如果客户端实现了AutoCloseable接口)来确保资源被正确释放。 实际上,Elasticsearch Java API Client(即co.elastic.clients.elasticsearch.ElasticsearchClient)的底层传输层(ElasticsearchTransport)实现了Closeable接口,而ElasticsearchClient本身也实现了Closeable(通过其transport成员)。因此,我们应该关闭客户端。 以下是一个简单的示例,展示如何正确关闭ElasticsearchClient: 方式1:显式调用close方法 ```java ElasticsearchClient client = ...; // 创建客户端 try { // 使用客户端进行操作 } finally { client._transport().close(); // 或者直接调用client.close(),因为ElasticsearchClient类也实现了Closeable } ``` 方式2:使用try-with-resources(推荐) ```java try (ElasticsearchClient client = createClient()) { // 假设createClient()方法返回一个ElasticsearchClient实例 // 使用客户端 } // 在此自动关闭 ``` 注意:在Spring Boot等框架中,我们通常将客户端声明为Bean,并设置其销毁方法,这样在应用关闭时框架会自动调用close方法。 总结:是的,Elasticsearch Java API Client需要关闭以释放网络连接和线程池等资源,防止资源泄漏。 如果需要更详细的代码示例,可以参考官方文档或引用[4]中的类似做法(尽管引用[4]是TransportClient,但关闭的思想是一致的)。 </think>是的,**Elasticsearch Java API Client 需要显式关闭**。这是重要的资源管理实践,主要基于以下原因: ### 关键原因分析 1. **资源释放**: - 客户端维护的底层连接池(如 HTTP 连接)需要显式关闭 - 未关闭会导致线程泄漏和文件描述符耗尽 - 长期运行的应用可能出现内存泄漏或连接超限错误 2. **实现机制**: - `ElasticsearchClient` 实现了 `java.io.Closeable` 接口 - 关闭操作会终止后台线程并释放网络资源 - 示例代码: ```java ElasticsearchClient client = ...; // 初始化客户端 try { // 执行操作... } finally { client._transport().close(); // 必须显式关闭 } ``` ### 最佳实践 1. **标准关闭方式**: ```java // 获取底层传输层并关闭 client._transport().close(); // 或直接关闭RestClient(如果直接使用) restClient.close(); ``` 2. **Spring Boot 集成**: ```java @Bean(destroyMethod = "close") // 容器关闭时自动清理 public ElasticsearchClient elasticsearchClient() { // ...初始化代码 } ``` 3. **try-with-resources**(Java 7+): ```java try (RestClient restClient = RestClient.builder(...).build(); ElasticsearchTransport transport = new RestClientTransport(...); ElasticsearchClient client = new ElasticsearchClient(transport)) { // 客户端操作... } // 自动关闭 ``` ### 不关闭的后果 - **生产环境风险**: - 连接池耗尽导致新请求阻塞 - 文件描述符超过系统限制(Linux 默认仅 1024) - 监控系统显示线程数持续增长 - **异常日志示例**: ``` java.io.IOException: Too many open files Caused by: java.lang.RuntimeException: Maximum connection pool size exceeded ``` ### 版本差异 | 客户端类型 | 关闭方式 | 备注 | |--------------------|------------------------------|-------------------------------| | Java API Client (8.x+) | `client._transport().close()` | 推荐使用 | | TransportClient (7.x-) | `client.close()` | 已弃用 | | RestHighLevelClient | `client.close()` | 旧版高级客户端 | > **关键结论**:所有 Elasticsearch Java 客户端都需要显式关闭,这是防止资源泄漏的必要步骤。官方文档明确要求调用 close 方法[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值