前言一、bulk概述
1.1 基础概念1.2 bulk语法1.3 操作类型 二、使用示例
2.1 批量插入2.2 批量更新2.3 批量删除 总结
前言
本篇文章主要总结如何使用bulk对es进行批量操作,若有不足请教大神门在评论区多多补充。
一、bulk概述 1.1 基础概念bulk是es提供的一种批量增删改的操作API。
1.2 bulk语法bulk对JSON串的有着严格的要求。每个JSON串不能换行,只能放在同一行,同时,相邻的JSON串之间必须要有换行(Linux下是n;Window下是rn)。bulk的每个操作必须要一对JSON串(delete语法除外)
例如若增加一个文档如下所示:
POST _bulk
{"create": {"_index": "example", "_type": "docs", "_id": 11}}
{"name": "test_bulk", "counter":"100"}
1.3 操作类型
create 如果文档不存在就创建,但如果文档存在就返回错误index 如果文档不存在就创建,如果文档存在就更新update 更新一个文档,如果文档不存在就返回错误delete 删除一个文档,如果要删除的文档id不存在,就返回错误
从以上可以看出index是比较常用的,因为bulk操作失败不会影响其他文档操作,我们可以从他的返回结果中查看失败的详细原因。
二、使用示例为了大家更快掌握使用方法,我们直接上代码
2.1 批量插入代码如下(示例):
public void importData(){
List
2.2 批量更新
这里我们根据id批量更新其中的name
public void updateNameByIds(List2.3 批量删除ids) { //这里我们把所有要更新的name统一更新为:大众洗浴 BulkRequest request = new BulkRequest(); // 更新热度值 for (String id : ids) { //使用map集合存储我们要修改的字段和要修改的数据 Map map = new HashMap<>(); map.put("name", "大众洗浴"); //第一个参数是索引,第二个参数是id,然后使用doc来放我们要修改的数据和集合 request.add(new UpdateRequest("indexName", id).doc(map)); } //批量更新操作 try { restHighLevelClient.bulk(request, RequestOptions.DEFAULT); } catch (IOException e) { LOGGER.error("更新失败:" + e.getMessage()); } }
代码如下(示例):
public void deleteByIds(Listids) { BulkRequest request = new BulkRequest(); // 更新热度值 for (String id : ids) { //第一个参数是索引,第二个参数是id,然后使用doc来放我们要修改的数据和集合 request.add(new DeleteRequest("indexName", id)); } //批量删除操作 try { restHighLevelClient.bulk(request, RequestOptions.DEFAULT); } catch (IOException e) { LOGGER.error("删除失败:" + e.getMessage()); } }
如果想根据指定条件进行删除我们也可以使用以下操作,但其删除比较慢:
public void deleteByKindId(String indexName,Listname)throws Exception{ DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(indexName); deleteByQueryRequest.setQuery(QueryBuilders.termsQuery("name", name)); remoteHighLevelClient.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT); }
总结
以上就是今天要讲的内容,本文仅仅简单介绍了bulk的使用,在数据量比较大的时候我们通常再结合游标的方式分批进行插入。



