Java对Elasticsearch的操作都是使用Client对象执行的。Client 定义的所有API都是异步执行的。(要么使用事件监听器回调或者使用Future模式)。Java操作ES的Client有两种:TransportClient和Rest Client。但是Elasticsearch 7.0中开始弃用TransportClient,在8.0中完全删除它。故在实际使用过程中建议使用Java高级REST client。Rest client执行HTTP请求来执行操作,无需再序列化的Java请求。对于TransportClient我们只做一些简单的API介绍,重点介绍Rest client。

REST Client 有两种风格:

  •  Low Level REST Client :用于Elasticsearch的官方低级客户端。它允许通过http与Elasticsearch集群通信。将请求编排和响应反编排留给用户自己处理。它兼容所有的Elasticsearch版本。(可以理解为对请求参数的封装,以及对响应结果的解析)
  • High Level REST Client :用于Elasticsearch的官方高级客户端。它是基于低级客户端的,它提供很多API,并负责请求的编排与响应的反编排。(PS:就好比是,一个是传自己拼接好的字符串,并且自己解析返回的结果;而另一个是传对象,返回的结果也已经封装好了,直接是对象,更加规范了参数的名称以及格式,更加面对对象一点)


TransportClient连接ES

1、pom中添加依赖

      <!-- TransportClient 依赖包-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.2.2</version>
        </dependency>

        <!-- 测试包,与JAVA连接ES无关 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

有些文章中会把下面的包也添加进依赖,实际上在transport中已经包含了elsaticsearch依赖,不需要再次添加。

    <dependency>
      <groupId>org.elasticsearch</groupId>
      <artifactId>elasticsearch</artifactId>
      <version>6.2.2</version>
      <scope>compile</scope>
    </dependency>

2、建立ES集群连接

首先创建ES集群:集群名为my-application

启动ES,然后就可以开始编写Java代码连接ES

package cn.zsm.es;

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 org.junit.Before;
import org.junit.Test;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class JavaEsTest {

    private String IP;
    private int PORT;

    @Before
    public void init(){
        this.IP = "192.168.?.?";
        this.PORT = 9300;
    }
    
    @Test
    public void esClient(){
        try {
            Settings settings = Settings.builder().put("cluster.name", "my-application").build();
            TransportClient client = new PreBuiltTransportClient(settings)
                    .addTransportAddresses(new TransportAddress(InetAddress.getByName(IP), PORT));
            System.out.println(client.toString());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

}

最后输出结果:证明我们连接ES成功

但是有时候我们要连接ES集群中的多个节点,需要添加多个TransportAddress,这时候我们该如何操作:看一下addTransportAddresses方法的源码:

    public TransportClient addTransportAddresses(TransportAddress... transportAddress) {
        this.nodesService.addTransportAddresses(transportAddress);
        return this;
    }

由此我们可以看到,addTransportAddresses方法可以接受多个参数,供我们连接ES集群使用。

RestClien连接ES:

1、pom依赖,这里我们使用High Level Client

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.2.2</version>
        </dependency>

也有些文章中将下面的依赖添加进pom,实际上它已经在elasticsearch-rest-high-level-client中被依赖,无需重复添加

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>6.2.2</version>
        </dependency>

2、建立ES连接

    @Test
    public void highClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost(IP, PORT, "http")));
        System.out.println(client.toString());
    }

输出结果:

同样,如果我们要连接集群中多个ES节点时,只需要在RestClient 的 builder 方法中多添加几个HttpPost对象即可,源代码如下:

    public static RestClientBuilder builder(HttpHost... hosts) {
        return new RestClientBuilder(hosts);
    }

 

补充:

Java配置多个ES节点时,请求的时候会随机选一个节点作为协调节点负责分发请求和处理结果,所以Java链接ES节点数量的多少,不会影响到Java请求ES查询结果的速度,只是其中某个节点宕机时,其他节点可以保证正常的查询和操作。

ES 端口9200与9300的区别:

  • 9200作为Http协议,主要用于外部通讯
  • 9300作为Tcp协议,jar之间就是通过tcp协议通讯
  • ES集群之间是通过9300进行通讯
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐