es java client_Elasticsearch java API客户端介绍

基本上官方指南就已经向我们说明了一切。如下图所示:

310f82d938381c09b158bc0693795baa.png

从官方指南上,ES的java 客户端分为两个大类。分别是:

下面分别说下这两种有什么区别。

Java API

在ES 7.0之前最常采用的API,基于TransportClient客户端。网上大部分ES 客户端的资料基本都是基于它的。这种方式在ES 7.x后已经不被官方推荐,且在8.0版本中完全移除它。

鉴于有很多人还在使用低版本的ES,所以这种方式在一段时间内应该还是不会消失。我们来看看它的基本使用示例。

首先我们在maven中引入依赖,

org.elasticsearch.client

transport

7.1.1

连接一个集群,

Settings settings = Settings.builder()

.put("cluster.name", "myClusterName").build();

TransportClient client = new PreBuiltTransportClient(settings)

.addTransportAddress(new TransportAddress(InetAddress.getByName("host1"), 9300))

.addTransportAddress(new TransportAddress(InetAddress.getByName("host2"), 9300));

索引一个文档,

IndexResponse response = client.prepareIndex("twitter", "_doc", "1")

.setSource(jsonBuilder()

.startObject()

.field("user", "kimchy")

.field("postDate", new Date())

.field("message", "trying out Elasticsearch")

.endObject()

)

.get();

Java REST Client

这是官方推荐的客户端,分为 Low Level REST Client 和 High Level REST Client,区别在于前者是直接让你通过 http 和 es 的集群通信,它更加灵活,随之带来的问题是调用者需要关心的细节也很多。调用者需要对 ES 较为熟悉才可以用好这些API。

High Level REST Client则是对Low Level REST Client的封装,它隐藏了大部分ES的细节,使得调用者即使不了解ES的细节也能用好客户端API。

下面来看看High Level REST Client的使用示例。

maven引入依赖,

org.elasticsearch

elasticsearch

7.1.0

org.elasticsearch.client

elasticsearch-rest-high-level-client

7.1.0

根据集群信息创建客户端实例,

public RestHighLevelClient restClient() {

final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();

credentialsProvider.setCredentials(AuthScope.ANY,

new UsernamePasswordCredentials(userName, password));

RestClientBuilder builder = RestClient.builder(new HttpHost(host, port))

.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));

RestHighLevelClient client = new RestHighLevelClient(builder);

return client;

}

创建索引,

public String createProfileDocument(ProfileDocument document) throws Exception {

UUID uuid = UUID.randomUUID();

document.setId(uuid.toString());

IndexRequest indexRequest = new IndexRequest(INDEX, TYPE, document.getId())

.source(convertProfileDocumentToMap(document));

IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);

return indexResponse.getResult().name();

}

性能对比

大家直接看下面这篇文章吧,有详细的对比数据。

如果你英语不好,我可以大概解释下。

文章中的实验从bulk index和search两个维度测试对比了二者之间的性能,这篇文章是用es 5.0的版本进行的测试,结果显示虽然rest client在性能上已经和transport client 相差不大了。而且ES官方还会不断的优化前者,所以你基本上不用担心性能上的瓶颈。

总结

大部分时候你都应该使用 high level的api进行ES操作,虽然自己使用http直接封装ES的客户端也是可以的。但是还是推荐使用high level的客户端API。一方面是它隐藏了ES的复杂操作,让你即使对ES不熟悉也能轻松的使用API进行读写数据。另一方面,大概率它比自己的封装更稳定。

另外,两种客户端走的协议和端口也不一样,TransportClient客户端使用的TCP协议,9300端口,而rest client使用的是http协议,走的是9200端口。

另外,spring boot官方有对ES封装的starter,可以和spring data集成使用。这种方式用起来肯定更方便,不过有个缺点就是更新太慢了,截止到我写这篇文章,spring data es的版本是3.2.x,只支持到ES 6.8.1的版本。

6a3b2239956e0ce1f1cdb59b1af7da8c.png

我个人比较推荐的还是 High Level REST Client 这种方式。

参考:

关注公众号:犀牛饲养员的技术笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值