前一篇有关ES的文章介绍了使用Rest方式调用ES的聚合API。Rest API使用了HTTP协议,按理来说,可以直接使用类似HttpClient的工具直接调用Rest API。虽然笔者并没有尝试过,但稍微想想一下就知道这种方法是可行的。这种方法主要有下面几个弊端:
- 需要开启ES的Http服务和端口。ES提供的Http服务功能非常全面,没有提供权限控制,防护也比较脆弱。一旦遭到破解,则数据面临极大的风险。所以,建议在生产中关闭Http服务,或者自己增加一层代理来实现权限控制。
- 调用比较困难。Rest API的核心是url和post数据,url直接需传入字符串,这样就不能使用IDE的查错功能。需要记忆的东西太多,不确定时就要去查API,影响开发效率。
- Http协议的一大特点是无连接性。也就是每一次请求都需要建立新的连接,我们知道tcp连接是比较耗时的过程。从性能的角度来说,直接使用Rest API也是不合适的。
ES所提供的Http服务适合用作集群状态和数据的监控,而不适合直接用于数据操作。ES提供了多种语言(包括Java、Python、PHP、Ruby等)版本的Client API,可以使用这些Client API编程实现数据操作功能。作为一个Java语言编程者,本文主要介绍使用Java版本的Client来操作数据。使用Java API需要依赖ES所提供的jar包,我们使用maven来下载所需的依赖包,maven依赖定义如下:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>1.5.0</version>
</dependency>
version表示依赖包的版本,可以输入任意存在的版本,本文的示例中使用1.5.0版的API。注意,建议API的版本与ES集群所使用的版本保持一致,以免出现因版本不一致而导致的冲突。
本文的主要内容包括:
- 介绍两类Client,解释它们的之间的差异;
- 使用Client进行index、document和聚合相关的操作。
1. Client
ES中所有的Java API调用都要使用Client对象,ES为API调用者提供了两类Client对象:NodeClient和TransportClient。下面来讲讲这两类Client的差异和使用场景。
1.1 NodeClient
NodeClient是一种嵌入式节点客户端。它首先在客户端启动一个节点(Node),并加入同名集群内。这个节点可以保存数据,并且数据能够被索引。然后从这个节点中获取Client,这类Client就是NodeClient。NodeClient无需指明ES服务端的地址,操作的数据位于启动的节点所在的集群中。下面是获得NodeClient的代码:
import org.elasticsearch.client.Client;
import org.elasticsearch.client.node.NodeClient;
import org.elasticsearch.node.Node;
import static org.elasticsearch.node.NodeBuilder.nodeBuilder;
public class MyNodeClient {
public static void main(String[] args) {
// 启动一个本地节点,并加入子网内的ES集群
Node node = nodeBuilder()
.clusterName("elasticsearch") // 要加入的集群名为elasticsearch
// .client(true) //如果设置为true,则该节点不会保存数据
.data(true) // 本嵌入式节点可以保存数据
.node(); // 构建并启动本节点
// 获得一个Client对象,该对象可以对子网内的“elasticsearch”集群进行相关操作。
Client nodeClient = node.client();
}
}
运行这段代码之后,可以看到工程中新增了一个data文件夹,这是因为data(true)将Node设置为可以存放数据的节点,数据正是放在了data文件夹下。

本文介绍了Elasticsearch的Java API使用,重点讲解了NodeClient和TransportClient的区别及应用场景,并展示了创建索引、文档CRUD及聚合操作的代码示例。
2165

被折叠的 条评论
为什么被折叠?



