您的位置:

ES客户端详解

一、ES客户端介绍

ES(Elasticsearch)是一种开源的分布式搜索引擎,通过RESTful web接口来进行通信。为了更加方便地使用ES,官方提供了各种语言的客户端,例如Java、Python、PHP和.NET等,同时也有非官方客户端。本文将重点介绍ES官方Java客户端。

二、ES Java客户端基本用法

ES Java客户端通过maven依赖引入,具体依赖如下:


<dependency>  
    <groupId>org.elasticsearch</groupId>  
    <artifactId>elasticsearch</artifactId>  
    <version>7.9.3</version>  
</dependency>  

接着创建一个TransportClient对象,连接到ES服务器:


TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); 

连接成功后,就可以进行各种操作,例如创建、更新、删除索引等等。这些操作可以使用IndexRequest、UpdateRequest和DeleteRequest对象完成。例如:


IndexRequest indexRequest = new IndexRequest(INDEX_NAME, TYPE_NAME, id).source(source);
UpdateRequest updateRequest = new UpdateRequest(INDEX_NAME, TYPE_NAME, id).doc(source).upsert(indexRequest);
DeleteRequest deleteRequest = new DeleteRequest(INDEX_NAME, TYPE_NAME, id);    

以上为ES Java客户端基本用法,除此之外还有一些高级用法,例如Bulk API批量操作、Scroll API滚动搜索等等,可以根据具体需求进行使用。

三、ES Java客户端配置

ES Java客户端也可以进行配置,常用的配置包括:

1. 连接池配置

连接池用于维护多个与ES服务器连接的TransportClient对象,以减少创建连接的开销,提高效率。连接池的配置可以使用Settings对象进行设置,例如:


Settings settings = Settings.builder().put("client.transport.sniff", true).put("cluster.name", "docker-cluster").build();
TransportClient client = new PreBuiltTransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); 

2. Retry配置

ES Java客户端默认会对失败的操作进行3次重试,重试间隔为500ms,可以使用以下代码修改配置:


Settings settings = Settings.builder().put("client.transport.retry_on_failure", true).put("client.transport.max_attempts", 5).put("client.transport.interval", "2s").build();
TransportClient client = new PreBuiltTransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); 

3. SSL配置

ES Java客户端支持SSL加密通信,可以使用以下代码进行配置:


Settings settings = Settings.builder().put("client.transport.nodes_sampler_interval", "5s").put("xpack.security.transport.ssl.enabled", true).put("xpack.security.transport.ssl.verification_mode", "none").put("cluster.name", "docker-cluster").build();
TransportClient client = new PreBuiltTransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); 

四、ES Java客户端异常处理

在使用ES Java客户端时,可能会遇到各种异常情况,例如网络异常、索引不存在等等。要正确处理这些异常,可以使用try-catch语句,例如:


try {
    IndexResponse response = client.index(indexRequest).get();
} catch (ElasticsearchException e) {
    if (e.status() == RestStatus.CONFLICT) {
        // 数据冲突处理
    } else if (e.status() == RestStatus.NOT_FOUND) {
        // 数据不存在处理
    }
} catch (Exception e) {
    // 其他异常处理
}

上述代码中,ElasticsearchException是ES Java客户端自定义的异常,可以用于捕获ES服务器返回的错误信息。

五、ES Java客户端示例代码

以下是一个基于ES Java客户端的简单示例代码:


public class ElasticsearchClient {

    private static final String INDEX_NAME = "index_name";
    private static final String TYPE_NAME = "type_name";

    private TransportClient client;

    public ElasticsearchClient() throws UnknownHostException {
        Settings settings = Settings.builder().put("client.transport.sniff", true).put("cluster.name", "docker-cluster").build();
        client = new PreBuiltTransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
    }

    public void close() {
        client.close();
    }

    public void insert(String id, String source) {
        try {
            IndexRequest indexRequest = new IndexRequest(INDEX_NAME, TYPE_NAME, id).source(source);
            IndexResponse response = client.index(indexRequest).get();
        } catch (Exception e) {
            // 异常处理
        }
    }

    public void update(String id, String source) {
        try {
            IndexRequest indexRequest = new IndexRequest(INDEX_NAME, TYPE_NAME, id).source(source);
            UpdateRequest updateRequest = new UpdateRequest(INDEX_NAME, TYPE_NAME, id).doc(source).upsert(indexRequest);
            UpdateResponse response = client.update(updateRequest).get();
        } catch (Exception e) {
            // 异常处理
        }
    }

    public void delete(String id) {
        try {
            DeleteRequest deleteRequest = new DeleteRequest(INDEX_NAME, TYPE_NAME, id);
            DeleteResponse response = client.delete(deleteRequest).get();
        } catch (Exception e) {
            // 异常处理
        }
    }

}

总结

到此为止,我们已经学习了ES Java客户端的基本用法、配置、异常处理和示例代码。ES Java客户端是ES的重要组成部分,在实际应用中具有广泛的应用价值。希望本文对大家有所帮助。