基本上官方指南就已经向咱们说明了一切。以下图所示:html
从官方指南上,ES的java 客户端分为两个大类。分别是:java
下面分别说下这两种有什么区别。spring
在ES 7.0以前最常采用的API,基于TransportClient客户端。网上大部分ES 客户端的资料基本都是基于它的。这种方式在ES 7.x后已经不被官方推荐,且在8.0版本中彻底移除它。json
鉴于有不少人还在使用低版本的ES,因此这种方式在一段时间内应该仍是不会消失。咱们来看看它的基本使用示例。segmentfault
首先咱们在maven中引入依赖,api
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>7.1.1</version> </dependency>
链接一个集群,dom
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));
索引一个文档,elasticsearch
IndexResponse response = client.prepareIndex("twitter", "_doc", "1") .setSource(jsonBuilder() .startObject() .field("user", "kimchy") .field("postDate", new Date()) .field("message", "trying out Elasticsearch") .endObject() ) .get();
这是官方推荐的客户端,分为 Low Level REST Client 和 High Level REST Client,区别在于前者是直接让你经过 http 和 es 的集群通讯,它更加灵活,随之带来的问题是调用者须要关心的细节也不少。调用者须要对 ES 较为熟悉才能够用好这些API。maven
High Level REST Client则是对Low Level REST Client的封装,它隐藏了大部分ES的细节,使得调用者即便不了解ES的细节也能用好客户端API。ide
下面来看看High Level REST Client的使用示例。
maven引入依赖,
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.1.0</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.1.0</version> </dependency>
根据集群信息建立客户端实例,
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(); }
你们直接看下面这篇文章吧,有详细的对比数据。
Benchmarking REST client and transport client
若是你英语很差,我能够大概解释下。
文章中的实验从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的版本。
我我的比较推荐的仍是 High Level REST Client 这种方式。
参考:
关注公众号:犀牛饲养员的技术笔记
csdn博客: https://blog.csdn.net/pony_ma...