引言
业余时间搞 python 爬虫爬取数据,完善我的汽车销量查询小助手(小程序);工作时间还是要努力完成领导分配的任务,做我的 Java 老本行的。
这不,现在就有个需求,集团要将 elasticsearch 版本从 2.2 升级到 6.3, 由于之前做项目使用 spring data es 来完成 es 数据的增删该查,现在一下升级到这么高的版本,遇到各种 API 不兼容的问题。并且 spring data es 由于整体框架 spring 等版本的限制,也不能使用了。
无奈之下,只能使用 elasticsearch 提供的 java reset client API 来完成之前的操作。工欲善其事,必先利其器。要使用 API,第一步就是要完整,熟练的理解各个 API 的用途,限制。在学习 API 的过程中,我将 API 的文档统一整理了一番,方便自己使用时查询,也希望能对用到这部分的同学提供方便。
注意,本 API 指南只针对 elasticsearch 6.3 版本。
概述Rest client 分成两部分:
Java Low Level REST Client
官方低级别 es 客户端,使用 http 协议与 Elastiicsearch 集群通信,与所有 es 版本兼容。
Java High level REST Client
官方高级别 es 客户端,基于低级别的客户端,它会暴露 API 特定的方法。
官方文档链接地址
High REST ClientHigh Client 基于 Low Client, 主要目的是暴露一些 API,这些 API 可以接受请求对象为参数,返回响应对象,而对请求和响应细节的处理都是由 client 自动完成的。
每个 API 在调用时都可以是同步或者异步的。同步和异步 API 的区别是什么呢?
同步 API 会导致阻塞,一直等待数据返回
异步 API 在命名上会加上 async 后缀,需要有一个 listener 作为参数,等这个请求返回结果或者发生错误时,这个 listener 就会被调用
起步 兼容性java 1.8
Elasticsearch 核心项目
Java Doc 地址只有英文版
Maven 配置 <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>6.3.2</version> </dependency> 依赖org.elasticsearch.client:elasticsearch-rest-client
org.elasticsearch:elasticsearch
初始化RestHighLevelClient 实例依赖 REST low-level client builder
RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"), new HttpHost("localhost", 9201, "http")));High-level client 会依赖 Low-level client 来执行请求, low-level client 则会维护一个请求的线程连接池,因为当 high-level 请求处理结束时,应该 close 掉这个连接,使 low-level client 能尽快释放资源。
client.close(); 文档 APIHigh level rest 客户端支持下面的 文档(Document) API
单文档 API
index API
Get API
Delete API
Update API
多文档 API
Bulk API
Multi-Get API
Index API IndexRequest IndexRequest request = new IndexRequest( "posts", // 索引 Index "doc", // Type "1"); // 文档 Document Id String jsonString = "{" + "\"user\":\"kimchy\"," + "\"postDate\":\"2013-01-30\"," + "\"message\":\"trying out Elasticsearch\"" + "}"; request.source(jsonString, XContentType.JSON); // 文档源格式为 json string Document Sourcedocument source 可以是下面的格式
Map
Map<String, Object> jsonMap = new HashMap<>(); jsonMap.put("user", "kimchy"); jsonMap.put("postDate", new Date()); jsonMap.put("message", "trying out Elasticsearch"); IndexRequest indexRequest = new IndexRequest("posts", "doc", "1") .source(jsonMap); // 会自动将 Map 转换为 JSON 格式XContentBuilder : 这是 Document Source 提供的帮助类,专门用来产生 json 格式的数据
XContentBuilder builder = XContentFactory.jsonBuilder(); builder.startObject(); { builder.field("user", "kimchy"); builder.timeField("postDate", new Date()); builder.field("message", "trying out Elasticsearch"); } builder.endObject(); IndexRequest indexRequest = new IndexRequest("posts", "doc", "1") .source(builder);Object 键对
IndexRequest indexRequest = new IndexRequest("posts", "doc", "1") .source("user", "kimchy", "postDate", new Date(), "message", "trying out Elasticsearch"); 同步索引 IndexResponse indexResponse = client.index(request); 异步索引前面已经讲过,异步执行函数需要添加 listener, 而对于 index 而言,这个 listener 的类型就是 ActionListener
client.indexAsync(request, listener);异步方法执行后会立刻返回,在索引操作执行完成后,ActionListener 就会被回调:
执行成功,调用 onResponse 函数
执行失败,调用 onFailure 函数
ActionListener<IndexResponse> listener = new ActionListener<IndexResponse>() { @Override public void onResponse(IndexResponse indexResponse) { } @Override public void onFailure(Exception e) { } }; IndexResponse