行业知识
ES学习日记(十)-------Java操作ES之连接客户端
Elasticsearch有两种连接方式: transport、rest。transport 通过TCP方式访问ES(只支持iava),rest 方式通过http API 访问ES(没有语言限制)。
ES官方建议使用Iest 方式,transport 在7.8 版本中不建议使用,在8.x的版本中废弃。你可以用Java客户端做很多事情:
执行标准的 index,get,delete,update,search等操作。
在正在运行的集群上执行管理任务。
但是,通过官方文档可以得知,现在存在至少三种Java客户端。
Transport Client
Java High Level REST Client
Java Low Level Rest client
造成这种混乱的原因是:
长久以来,ES并没有官方的Java客户端,并且Java白身是可以简单支持ES的API的,于是就先做成了Transportclient。但是Transportclient 的缺点是显而易见的,它没有使用RESTfuI风,格的接口,而是二进制的方式传输数据。
之后ES官方推出了 Java Low Level REST client,它支持RESTful,用起来也不错。但是缺点也很明显,因为Transportclient 的使用者把代码迁移到 Low Level REST client 的工作量比较大。官方文档专门为迁移代码出了一堆文档来提供参考。
现在ES官方推出 Java High Level REST client ,它是基于Java Low Level REST client 的封装,并且API接收参数和返回值和 Transportclient 是一样的,使得代码迁移变得容易并且支持了RESTful的风格,兼容了这两种客户端的优点。当然缺点是存在的,就是版本的问题。ES的小版本更新非常频繁,在最理想的情况下,客户端的版本要和ES的版本一致(至少主版本号一致),次版本号不一致的话,基本操作也许可以,但是新API就不支持了。
一、创建新项目,步骤为maven创建,增加依赖,编写测试类,这几步没啥好说的,直接上pom文件依赖图
抄作业的同学看这里
org.elasticsearch elasticsearch 7.4.2 org.elasticsearch.client elasticsearch-rest-client 7.4.2 org.elasticsearch.client elasticsearch-rest-high-level-client 7.4.2 junit junit 4.12 compile cn.hutool hutool-all 5.6.2
因为是测试连接,建议直接抄作业就行,只是测试下能不能连上ES,一些基本操作后续博客会更新,
启动类源代码:
package com.zhxd;import cn.hutool.core.util.ObjectUtil;import org.apache.http.HttpHost;import org.elasticsearch.action.index.IndexRequest;import org.elasticsearch.action.index.IndexResponse;import org.elasticsearch.client.RequestOptions;import org.elasticsearch.client.RestClient;import org.elasticsearch.client.RestHighLevelClient;import org.junit.After;import org.junit.Before;import org.junit.Test;import java.io.IOException;import java.util.HashMap;/** * Hello world! * * @author wht */public class ElasticsearchApplication { private RestHighLevelClient client = null; /** * 连接方式 */ private final String SCHEME = "HTTP"; /** * 准备httpHost,暂时单机,集群式修改此位置即可 */ HttpHost[] httpHosts = new HttpHost[]{ new HttpHost("172.18.8.146",9200,SCHEME)// new HttpHost("172.18.8.146",9200,SCHEME),// new HttpHost("172.18.8.146",9200,SCHEME) }; @Before public void init(){ client = new RestHighLevelClient(RestClient.builder(httpHosts)); } @After public void close() { try { //判断空值关闭 if (ObjectUtil.isNotEmpty(client)) { client.close(); } } catch (Exception e) { e.printStackTrace(); } } /** * 添加测试 */ @Test public void creat() throws IOException { HashMap map = new HashMap(); map.put("name","董老六"); map.put("content","中国必胜"); //指定索引和id IndexRequest indexRequest = new IndexRequest("ik").id("5").source(map); //执行请求,第二个参试数枚举,直接用default IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT); }} source的方式有很多种,常用的就两种
此次测试连接用map,连接之前的ik,其他关键信息都写在源码注释上了
测试成功后用head看一下,已经在里面了