哈~ Elasticsearch就不用过多介绍了吧,咱们直接将重点,不讲概念
楼主是个菜鸡,之前的项目里要用到Elasticsearch,经过楼主和架构的一番苦战、撕逼,终于,还是屈服于架构,弃用6.5版本,选用了最新版的7.8.0
讲真的,很痛苦的,那会可是全网都找不到这个版本的教程啊,官网的也不是很清楚,我被折磨了好久才搞定
好好好,放下你的砖头,我说我说!!!!
由于楼主用的时候,spring还没整合7.8.0的ES,所以楼主用的原生ES,建议如果spring没有整合,不要强制指定版本,因为可能会出未知错误,这些错误可能是不兼容,可能是其他方面,属于不可控范围,且排查极难
上重点!!!
第一步,要用ES,就得需要依赖,此处建议导入三个依赖(楼主很不幸,遇到了依赖问题,原因是只导入了官网提供的一个高级客户端依赖,没有低级依赖以及核心依赖)
org.elasticsearch.client
elasticsearch-rest-high-level-client
7.8.0
org.elasticsearch.client
elasticsearch-rest-client
7.8.0
org.elasticsearch
elasticsearch
7.8.0
对了,这块需要一个客户端,我们采用官方推荐的高级客户端,集群的话就写多个,单点的话就写一个
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")));
第二步,上API,ES本身也是提供了一些API类,可以实现我们对ES的操作,注:出现的所有名字为client的对象都是ES的RestHighLevelClient ,请求方式都是RequestOptions.DEFAULT
创建索引:
CreateIndexRequest request = new CreateIndexRequest("索引名");
client.indices().create(request,RequestOptions.DEFAULT);
获取索引:
/*
* 调用方法如果是exists,是判断是否存在,如果是get,那就是获取
*/
GetIndexRequest request = new GetIndexRequest("索引名");
restHighLevelClient.indices().exists(request,RequestOptions.DEFAULT);
删除索引:
DeleteIndexRequest request = new DeleteIndexRequest("索引名");
restHighLevelClient.indices().delete(request,RequestOptions.DEFAULT);
添加文档:
IndexRequest request = new IndexRequest("索引名");
request.id("id");
request.source("json",XContentType.JSON);
restHighLevelClient.index(request,RequestOptions.DEFAULT);
获取文档:
/*
* 获取文档是否存在
*/
GetRequest request = new GetRequest("索引名", "id");
restHighLevelClient.exists(request, RequestOptions.DEFAULT);
/*
* 获取文档
*/
GetRequest request = new GetRequest("索引名", "id");
restHighLevelClient.get(request, RequestOptions.DEFAULT);
更新文档:
UpdateRequest request = new UpdateRequest("索引名", "id");
request.id("id");
request.doc("json",XContentType.JSON);
restHighLevelClient.update(request,RequestOptions.DEFAULT);
删除文档:
DeleteRequest request = new DeleteRequest("索引名", "id");
restHighLevelClient.delete(request,RequestOptions.DEFAULT);
以上就是ES的基本API类、方法,接下来是我们在项目中很可能用到的-------批量处理,以批量插入为例,其他的批量删除啥的都是一样的
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.add()
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList userList = new ArrayList<>();
for (int i = 0; i < userList.size(); i++) {
//批量更新删除
bulkRequest.add(new IndexRequest("索引名").id("自定义ID,不定义的话可以不调用这个.id方法") .source(JSON.toJSONString(userList.get(i)),XContentType.JSON));
}
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
批量插入的类就是BulkRequest ,但是有一个地方有的朋友可能会有疑问,source,这个格式是什么,上面我写的是json,但其实它不仅仅可以用json,map也可以哦~,比如:
Map map = new HashMap<>();
//TODO 对map处理
/*
* 自己指定可以指定ID,也可以不指定,不指定ID的话,就不要用这个.id方法哦
*/
request.add(new IndexRequest("索引名").id("自己指定ID").source(map));
本次分享就到这里啦~ 下一篇给大家讲Bulk的弊端,以及对应解决方案---BulkProcessor