java操作ElasticSearch之批量操作

pom文件

# 版本号 
<version.elasticsearch-rest-high-level-client>6.5.0</version.elasticsearch-rest-high-level-client>       

     <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>${version.elasticsearch-rest-high-level-client}</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>${version.elasticsearch-rest-high-level-client}</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>${version.elasticsearch-rest-high-level-client}</version>
        </dependency>

RestHighLevelClient(操作ES的客户端,使用时注入bean即可)

 public RestHighLevelClient restHighLevelClient() {

        RestClientBuilder rclientBuilder = RestClient.builder(new HttpHost(host, port, "http"))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                        return httpClientBuilder
                                .setKeepAliveStrategy((response, context) -> Duration.ofMinutes(5).toMillis());
                    }
                });
        return new RestHighLevelClient(rclientBuilder);

DeleteRequest批量删除

    /**
     * @Description: 根据es主键删除数据
     * @Params:
     * @Return:
     * @Author: Mr.myq
     * @Date: 2022/12/2011:04
     */
    @Override
    public void deleteAllByIds(List<String> ids) {
        if (!CollectionUtils.isEmpty(ids)) {
            try {
                List<List<String>> outherList = SubListUtil.splitList(ids, count);
                for (List<String> innerList : outherList) {
                    //批量删除数据
                    BulkRequest request = new BulkRequest();
                    request.timeout("60s");
                    for (String id : innerList) {
// 类型json/_doc
                        DeleteRequest source = new DeleteRequest().index("索引").id(id).type(”_doc“);
                        request.add(source);
                    }
                    BulkResponse response = restHighLevelClient().bulk(request, RequestOptions.DEFAULT);
                    log.debug("ES批量删除数据 是否有失败 : " + response.hasFailures());
                }
            } catch (IOException e) {
                e.printStackTrace();
                log.error("ES批量删除数据:  " + e.toString());
                throw new RuntimeException("ES批量删除数据:  {}", e);
            } finally {
                ids.clear();
            }
        }
    }

BulkRequest批量新增

    /**
     * 批量更新es数据
     *
     * @param esDateList
     */
    private void batchUpdateEsData(List<CmsGoodsEntity> esDateList) {
        if (CollectionUtils.isEmpty(esDateList)) {
            return;
        }
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout("200s");
        try {
            for (int i = 0; i < esDateList.size(); i++) {
                CmsGoodsEntity object = esDateList.get(i);
                Map<String, Object> param = new LinkedHashMap<>();
                String goodid = object.getGoodid();
                param.put("tariffs_rate", object.getTariffsRate());
                param.put("inspection_charges_fee", object.getInspectionChargesFee());
                param.put("rates", object.getRates());
                UpdateRequest updateRequest = new UpdateRequest(”索引“, "类型", goodid);
                updateRequest.doc(param);
                bulkRequest.add(updateRequest);
            }
            // 操作ES
            BulkResponse bulk = restHighLevelClient().bulk(bulkRequest, RequestOptions.DEFAULT);
            log.info("批量更新ES 是否有失败 {} ", bulk.hasFailures());
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("***********批量更新ES数据异常***********");
        } finally {
            esDateList.clear();
        }
    }

DeleteByQueryRequest根据查询条件删除所有ES数据

    /**
     * @Description: 根据查看条件删除
     * @Params:
     * @Return:
     * @Author: Mr.myq
     * @Date: 2023/2/1415:25
     */
    @Override
    public void deleteBySupplierIdAndHispAndSource(Integer supplierId, String hisp, Integer source) {
        //通过QueryBuilders中的搜索逻辑
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        //1 设置条件
        //设置删除条件: key = value
        TermQueryBuilder supplierIdTermQueryBuilder = QueryBuilders.termQuery("supplier_id", supplierId);
        if (!StringUtils.isEmpty(hisp)) {
            TermQueryBuilder hispTermQueryBuilder = QueryBuilders.termQuery("hisp", hisp);
            queryBuilder.must(hispTermQueryBuilder);
        }
        TermQueryBuilder sourceTermQueryBuilder = QueryBuilders.termQuery("source", source);
        queryBuilder.must(sourceTermQueryBuilder);
        queryBuilder.must(supplierIdTermQueryBuilder);

        //2 通过DeleteByQueryRequest来构建删除请求,setQuery来装载条件,indices来指定索引
        DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest();
        deleteByQueryRequest.setTimeout("6000s");
        deleteByQueryRequest.setQuery(queryBuilder);
        //指定删除索引
        deleteByQueryRequest.indices(restClientConfig.getIndex());
        deleteByQueryRequest.setConflicts("proceed");
        try {
            //3 通过deleteByQuery来发起删除请求
            BulkByScrollResponse deleteResponse = restClientConfig.restHighLevelClient().deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT);
            if (deleteResponse.getDeleted() >= 1) {
                log.info("deleteData,删除成功,删除文档条数: " + deleteResponse.getDeleted() + " ,indexName:" + restClientConfig.getIndex());
            }
        } catch (IOException e) {
            e.printStackTrace();
            log.error("无法连接到ES目标服务器");
            throw new TargetServerException("无法连接到ES目标服务器");
        }
    }

UpdateByQueryRequest批量更新

    /**
     * @Description: 根据查看条件更新
     * @Params:
     * @Return:
     * @Author: Mr.myq
     * @Date: 2023/2/1415:25
     */
    public void updateBySupplierIdAndHispAndSource(Integer supplierId, String hisp, Integer source,String value) {
        //通过QueryBuilders中的搜索逻辑
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        //1 设置条件
        //设置删除条件: key = value
        TermQueryBuilder supplierIdTermQueryBuilder = QueryBuilders.termQuery("supplier_id", supplierId);
        if (!StringUtils.isEmpty(hisp)) {
            TermQueryBuilder hispTermQueryBuilder = QueryBuilders.termQuery("hisp", hisp);
            queryBuilder.must(hispTermQueryBuilder);
        }
        TermQueryBuilder sourceTermQueryBuilder = QueryBuilders.termQuery("source", source);
        queryBuilder.must(sourceTermQueryBuilder);
        queryBuilder.must(supplierIdTermQueryBuilder);

        //2 通过DeleteByQueryRequest来构建删除请求,setQuery来装载条件,indices来指定索引
        UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest();
        updateByQueryRequest.setTimeout("6000s");
        updateByQueryRequest.setQuery(queryBuilder);

        // 这个实际上就是对应给脚本中传参数的对象。
        HashMap<String, Object> params = new HashMap<>(16);
        params.put("hobby", "修改的参数value");
        final Script script = new Script(
                ScriptType.INLINE, "painless",
                "ctx._source.hobby = params.hobby",
                params);
        updateByQueryRequest.setScript(script);
        //指定索引
        updateByQueryRequest.indices(restClientConfig.getIndex());
        updateByQueryRequest.setConflicts("proceed");
        try {
            //3 通过deleteByQuery来发起删除请求
            BulkByScrollResponse deleteResponse = restClientConfig.restHighLevelClient().updateByQuery(updateByQueryRequest, RequestOptions.DEFAULT);
            if (deleteResponse.getUpdated() >= 1) {
                log.info("更新成功,更新文档条数: " + deleteResponse.getUpdated() + " ,indexName:" + restClientConfig.getIndex());
            }
        } catch (IOException e) {
            e.printStackTrace();
            log.error("无法连接到ES目标服务器");
            throw new TargetServerException("无法连接到ES目标服务器");
        }
    }

BulkRequest批量删除


    /**
     * 批量更新es数据
     *
     * @param esDateList
     */
    private void batchUpdateEsData(List<CmsGoodsEntity> esDateList) {
        if (CollectionUtils.isEmpty(esDateList)) {
            return;
        }
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout("600s");
        RestHighLevelClient restHighLevelClient = restClientConfig.restHighLevelClient();
        try {
            for (int i = 0; i < esDateList.size(); i++) {
                CmsGoodsEntity object = esDateList.get(i);
                Map<String, Object> param = new LinkedHashMap<>();
                String goodid = object.getGoodid();
                param.put("tariffs_rate", object.getTariffsRate());
                param.put("inspection_charges_fee", object.getInspectionChargesFee());
                param.put("rates", object.getRates());
                UpdateRequest updateRequest = new UpdateRequest(restClientConfig.getIndex(), "_doc", goodid);
                updateRequest.doc(param);
                bulkRequest.add(updateRequest);
            }
            // 操作ES
            BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
            log.warn("批量更新ES 是否有失败 {} ", bulk.hasFailures());
        } catch (IOException e) {
            log.error("批量更新ES数据异常,e", e);
            e.printStackTrace();
            throw new RuntimeException("ES批量更新数据异常:{}" + e);
        } finally {
            try {
                restHighLevelClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            esDateList.clear();
        }
    }

Script更新

public void updateHobby(String user, ESEntity esEntity) throws IOException {
        final BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("user", user));
        // 这个实际上就是对应给脚本中传参数的对象。
        HashMap<String, Object> params = new HashMap<>(16);
        params.put("hobby", "和女朋友爬山");
        final Script script = new Script(
                ScriptType.INLINE, "painless",
                "ctx._source.hobby = params.hobby",
                params);
        updateByQuery(queryBuilder, "索引名称", script);
    }

出现: 版本冲突、文档类型不对、JAR包与使用的API不一致或其他问题。都可参考以下连接。

ElasticSearch超级实用API描述

以上代码需要变动一下,将一些参数替换掉。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中,可以使用Elasticsearch官方提供的Java API实现批量添加数据。以下是一个简单的示例代码: ``` import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.reindex.BulkByScrollResponse; import org.elasticsearch.index.reindex.DeleteByQueryRequest; import org.elasticsearch.index.reindex.DeleteByQueryResponse; import org.elasticsearch.index.reindex.UpdateByQueryRequest; import org.elasticsearch.index.reindex.UpdateByQueryResponse; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptType; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; public class ElasticsearchBulkAddExample { private final RestHighLevelClient client; public ElasticsearchBulkAddExample(RestHighLevelClient client) { this.client = client; } public void bulkAdd() throws IOException { BulkRequest bulkRequest = new BulkRequest(); // 添加要批量添加的数据 List<Map<String, Object>> dataList = new ArrayList<>(); Map<String, Object> data1 = Map.of("title", "Java入门教程", "content", "Java基础语法、面向对象编程等"); Map<String, Object> data2 = Map.of("title", "Java高级编程", "content", "多线程、网络编程、JVM优化等"); dataList.add(data1); dataList.add(data2); // 将数据添加到BulkRequest中 for (Map<String, Object> data : dataList) { bulkRequest.add(client.prepareIndex("index_name", "doc_type").setSource(data, XContentType.JSON)); } // 执行批量添加操作 BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT); if (bulkResponse.hasFailures()) { // 处理失败情况 } else { // 处理成功情况 } } } ``` 在上面的示例代码中,我们首先创建一个BulkRequest对象,然后将要批量添加的数据添加到BulkRequest中。最后调用client.bulk()方法执行批量添加操作。注意,上面的代码中的index_name和doc_type需要替换为你实际使用的索引名和文档类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心有城府,腹有良谋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值