Elasticsearch java API客户端介绍
基本上官方指南就已经向我们说明了一切。如下图所示:
从官方指南上,ES的java 客户端分为两个大类。分别是:
- Java REST Client
- Java API
下面分别说下这两种有什么区别。
Java API
在ES 7.0之前最常采用的API,基于TransportClient客户端。网上大部分ES 客户端的资料基本都是基于它的。这种方式在ES 7.x后已经不被官方推荐,且在8.0版本中完全移除它。
鉴于有很多人还在使用低版本的ES,所以这种方式在一段时间内应该还是不会消失。我们来看看它的基本使用示例。
首先我们在maven中引入依赖,
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>7.1.1</version>
</dependency>
连接一个集群,
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引入依赖,
<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 这种方式。
参考:
- ES官方文档
- Benchmarking REST client and transport client
- 3522: [Poi2014]Hotel
- 3299: [USACO2011 Open]Corn Maze玉米迷宫
- 2272: [Usaco2011 Feb]Cowlphabet 奶牛文字
- 1632: [Usaco2007 Feb]Lilypad Pond
- 1630/2023: [Usaco2005 Nov]Ant Counting 数蚂蚁
- Java设计模式(七)Decorate装饰器模式
- 1623: [Usaco2008 Open]Cow Cars 奶牛飞车
- 1622: [Usaco2008 Open]Word Power 名字的能量
- 3297: [USACO2011 Open]forgot
- 1740: [Usaco2005 mar]Yogurt factory 奶酪工厂
- 1741: [Usaco2005 nov]Asteroids 穿越小行星群
- 3298: [USACO 2011Open]cow checkers
- 3433: [Usaco2014 Jan]Recording the Moolympics
- 3410: [Usaco2009 Dec]Selfish Grazing 自私的食草者
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- golang实现php里的serialize()和unserialize()序列和反序列方法详解
- keras 实现轻量级网络ShuffleNet教程
- Python应用实现处理excel数据过程解析
- Python实现爬取并分析电商评论
- python中怎么表示空值
- Keras自动下载的数据集/模型存放位置介绍
- Keras 切换后端方式(Theano和TensorFlow)
- python 字符串的驻留机制及优缺点
- php微信公众号开发之翻页查询
- php 中phar包的使用教程详解
- php微信公众号开发之快递查询
- Scrapy框架介绍之Puppeteer渲染的使用
- Keras设置以及获取权重的实现
- Java自动化测试(Android app界面元素 33)
- 太厉害了,这款开源类库可以帮你简化每一行代码