1

前言

本节描述了Elasticsearch提供的Java API,所有的Elasticsearch操作都使用客户端对象执行,所有操作本质上都是完全异步的(要么接收监听器,要么未来返回)。

此外,客户端上的操作可能会大量累积和执行。

注意,所有的API都是通过Java API公开的(实际上,Java API是在内部使用以执行它们的)。

警告
我们计划在Elasticsearch 7.0中对TransportClient进行弃用,并在8.0中完全删除它,替而代之,你应该使用Java高级REST客户端,它执行HTTP请求而不是序列化的Java请求。迁移指南描述了迁移所需的所有步骤。

Java高级REST客户端目前支持更常用的API,但还有很多东西需要补充,您可以通过告诉我们您的应用程序需要哪些缺失的API来帮助我们优化优先级,通过向这个issue添加注释:Java高级REST客户端完整性

任何丢失的API都可以通过使用具有JSON请求和响应主体的低级Java REST客户端来实现。

Javadoc

transport clientjavadoc可以在这里找到:https://artifacts.elastic.co/...

Maven存储库

Elasticsearch驻留在Maven Central上。

例如,您可以在pom.xml文件中定义最新的版本:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>6.2.4</version>
</dependency>

Lucene Snapshot存储库

任何主要版本(如beta)的第一个releases版本都可能构建在Lucene Snapshot版本之上,在这种情况下,您将无法解析客户端的Lucene依赖项。

例如,如果您想使用基于Lucene 7.0.0-snapshot-00142c9的6.0.0-beta1版本,您必须定义以下存储库。

Maven:

<repository>
    <id>elastic-lucene-snapshots</id>
    <name>Elastic Lucene Snapshots</name>
    <url>http://s3.amazonaws.com/download.elasticsearch.org/lucenesnapshots/00142c9</url>
    <releases><enabled>true</enabled></releases>
    <snapshots><enabled>false</enabled></snapshots>
</repository>

Gradle:

maven {
    url 'http://s3.amazonaws.com/download.elasticsearch.org/lucenesnapshots/00142c9'
}

Log4j 2记录器

您还需要包括Log4j 2依赖项:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.9.1</version>
</dependency>

并在类路径中提供Log4j 2配置文件,例如,你可以给你的src/main/resources工程目录添加一个log4j2.properties文件,像这样:

appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout

rootLogger.level = info
rootLogger.appenderRef.console.ref = console

使用另一个记录器

如果你想使用另一个日志记录器,而不是Log4j 2,你可以使用SLF4J bridge来实现这一点:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-to-slf4j</artifactId>
    <version>2.9.1</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.24</version>
</dependency>

这个页面列出了可以使用的实现,选择您最喜欢的日志记录器,并将其作为依赖项添加。例如,我们将使用slf4j-simple 日志记录器:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.21</version>
</dependency>

java客户端

你可以通过多种方式使用Java客户端:

  • 在现有集群上执行标准索引、获取、删除和搜索操作
  • 在运行的集群上执行管理任务

获取一个Elasticsearch客户端很简单,获取客户端最常见的方法是创建一个连接到集群的TransportClient

重要
客户端必须具有与集群中的节点相同的主版本(例如,2.x,或5.x),客户端可能连接到具有不同次要版本的集群(例如2.3.x),但可能不支持新功能,理想情况下,客户端应该具有与集群相同的版本。

警告
我们计划在Elasticsearch 7.0中对TransportClient进行弃用,并在8.0中完全删除它,替而代之,你应该使用Java高级REST客户端,它执行HTTP请求而不是序列化的Java请求。迁移指南描述了迁移所需的所有步骤。

Java高级REST客户端目前支持更常用的API,但还有很多东西需要补充,您可以通过告诉我们您的应用程序需要哪些缺失的API来帮助我们优化优先级,通过向这个issue添加注释:Java高级REST客户端完整性

任何丢失的API都可以通过使用具有JSON请求和响应主体的低级Java REST客户端来实现。

传输客户端

TransportClient使用传输模块远程连接到Elasticsearch集群,它不加入集群,但只需获取一个或多个初始传输地址,并在每个操作上以循环的方式与它们通信(尽管大多数操作可能是“两跳”操作)。

// on startup

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
        .addTransportAddress(new TransportAddress(InetAddress.getByName("host1"), 9300))
        .addTransportAddress(new TransportAddress(InetAddress.getByName("host2"), 9300));

// on shutdown

client.close();

注意,如果你使用的是与“elasticsearch”不同的集群名称,则必须设置集群名称:

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

传输客户端具有集群嗅探特性,允许动态添加新主机并删除旧主机,当启用嗅探时,传输客户机将连接到其内部节点列表中的节点,这些节点是通过调用addTransportAddress构建的。在此之后,客户端将调用这些节点上的内部集群状态API来发现可用的数据节点,客户端的内部节点列表将仅用这些数据节点替换,默认情况下,这个列表每5秒刷新一次。注意,嗅探器连接的IP地址是在这些节点的Elasticsearch配置中声明为发布的地址。

请记住,如果该节点不是一个数据节点,该列表可能不包括它连接到的原始节点。例如,如果您最初连接到一个主节点,在嗅探之后,没有进一步的请求将进入主节点,而是指向任何数据节点。传输客户端排除非数据节点的原因是为了避免将搜索流量发送给主节点。

为了启用嗅探,请设置client.transport.snifftrue:

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

其他传输客户端级别设置包括:

  • 参数client.transport.ignore_cluster_name

    • 描述:设置为true以忽略连接节点的集群名称验证。(自从0.19.4)
  • 参数client.transport.ping_timeout

    • 描述:等待节点的ping响应的时间,默认为5s。
  • 参数client.transport.nodes_sampler_interval

    • 描述:采样/ping节点登记和连接的频率,默认5s。

将客户端连接到仅协调的节点

您可以在本地启动一个只协调的节点,然后在应用程序中创建一个TransportClient,该客户端连接到这个只协调的节点。

通过这种方式,只需协调的节点将能够加载您需要的任何插件(例如,关于discovery插件)。


下一篇:Elasticsearch Java API 6.2(文档API)


博弈
2.5k 声望1.5k 粉丝

态度决定一切