由于TransportClient已经都学习过了,所以直接学习迁移指南就可以。
迁移指南官方给的很简单,有的地方需要动一下脑子,举一反三,因为官网给的都是例子,不过只要知道一个变化的情况,举一反三也不是很难。
Rest里值得一体的也多了很多新的功能,因为可以直接使用low-level rest client去模拟访问,相当于封装了kibana的dev tools直接构建的json表达式,所以可以灵活构建出各种Request对象,包括各种原来没见过的ListTasksRequest、MainResponse、PutRepositoryRequest等待,暂时我不需要深究,先熟练基本操作。
原因
官方说的对于TransportClient,7.0不建议使用,8.0删除
原因大概就是ES一直版本在更新,TransportClient对es版本的匹配要求比较高,而Rest服务要求不高,兼容能力强
迁移
Client初始化和关闭
这个区别主要在于端口,一个TCP,一个HTTP
Settings settings = Settings.builder()
.put("cluster.name", "prod").build();
TransportClient transportClient = new PreBuiltTransportClient(settings)
.addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300))
.addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9301));
transportClient.close();
Rest
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")));
client.close();
Request和Response对象
这方面,两者的请求和响应(包括index、delete、update的upsert、bulk、bulkProcessor等等)因为他们都是使用导入的是(以index为例):
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
两者在一个包里,所以具体里面的东西没有什么区别,区别在于如何使用和返回这几个对象
但是Rest可以构建更多样的
以IndexResponse为例
IndexRequest构建情况是相同的,区别在于构建IndexResponse,transport使用RequestBuilder的相关prepare遗留方法去构建Response,rest直接使用client的对应方法去返回一个对应的Response。
比如transportClient.prepareBulk().get()直接变成client.bulk()得到的同样都是BulkResponse;
prepareSearch变成了search方法
IndexResponse response = transportClient.index(indexRequest).actionGet();
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
不用Builder怎么执行——直接client执行
管理用low-level Rest client
transport直接可以使用client.admin()来管理查看cluster状态
ClusterHealthResponse response = client.admin().cluster().prepareHealth().get(); //
ClusterHealthStatus healthStatus = response.getStatus(); //
if (healthStatus != ClusterHealthStatus.GREEN) {
//
}
而Rest可以用low-level Rest client模拟请求返回
DeleteRequest request = new DeleteRequest("index", "doc", "id");
//同步
DeleteResponse response = transportClient.delete(request).actionGet();
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
//异步
transportClient.delete(request, new ActionListener<DeleteResponse>() { //
@Override
public void onResponse(DeleteResponse deleteResponse) {
//
}
@Override
public void onFailure(Exception e) {
//
}
});
client.deleteAsync(request, new ActionListener<DeleteResponse>() {
@Override
public void onResponse(DeleteResponse deleteResponse) {
}
@Override
public void onFailure(Exception e) {
}
});
Request request = new Request("GET", "/_cluster/health");
request.addParameter("wait_for_status", "green");
Response response = client.getLowLevelClient().performRequest(request);
ClusterHealthStatus healthStatus;
try (InputStream is = response.getEntity().getContent()) {
Map<String, Object> map = XContentHelper.convertToMap(XContentType.JSON.xContent(), is, true);
healthStatus = ClusterHealthStatus.fromString((String) map.get("status"));
}
if (healthStatus != ClusterHealthStatus.GREEN) {
}