我的DEMO项目下载:https://gitee.com/zhuhongliang/soringboot_elastic_search_732.git

看删除代码:

/**
 * 删除文档
 * @param indeces 索引
 * @param delete_id 要删除的id
 */
public void deleteById(String indeces, String delete_id){
    DeleteRequest request = new DeleteRequest(indeces.toLowerCase(), delete_id);
    // 等待主分片可用的超时时间
    request.timeout(TimeValue.timeValueMinutes(10));
    DeleteResponse deleteResponse = null;
    try {
        deleteResponse = client.delete(request, RequestOptions.DEFAULT);
    } catch (IOException e) {
        e.printStackTrace();
    }
    String index = deleteResponse.getIndex();
    String id = deleteResponse.getId();
    long version = deleteResponse.getVersion();
    log.info("index:" + index + "; id:" + id + ",version:" + version);
    //判断删除的文档是否存在 :
    if(deleteResponse.getResult() == DocWriteResponse.Result.NOT_FOUND){
        log.error("未找到需要删除的文档!");
        return;
    }
    ReplicationResponse.ShardInfo shardInfo = deleteResponse.getShardInfo();
    if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
        log.error("未完全执行所有分片,总分片数为:" + shardInfo.getTotal() + ",执行的分片数为:"+ shardInfo.getSuccessful());
    }
    if (shardInfo.getFailed() > 0) {
        for (ReplicationResponse.ShardInfo.Failure failure : shardInfo.getFailures()) {
            String reason = failure.reason();
            log.error("失败原因:" + reason);
            return;
        }
    }
}
/**
 * 批量删除文档
 * @param list
 */
public void deleteMultiDoc(String index, List<String> list){
    BulkRequest request = new BulkRequest();
    /**
     * 遍历
     * IndexRequest不设置id,让系统自己添加
     * DeleteRequest 批量删除
     * UpdateRequest 批量更新
     */
    list.forEach((id)->{
        request.add(new DeleteRequest(index.toLowerCase(), id));
    });
    try {
        BulkResponse bulkResponse = client.bulk(request,RequestOptions.DEFAULT);
        bulkResponse.forEach((BulkItemResponse bulkItemResponse)->{
            DocWriteResponse itemResponse = bulkItemResponse.getResponse();
            switch (bulkItemResponse.getOpType()) {
                case INDEX:
                case CREATE:
                    IndexResponse indexResponse = (IndexResponse) itemResponse;
                    break;
                case UPDATE:
                    UpdateResponse updateResponse = (UpdateResponse) itemResponse;
                    break;
                case DELETE:
                    DeleteResponse deleteResponse = (DeleteResponse) itemResponse;
                    log.info(JSONObject.toJSONString(deleteResponse));
                    if(DocWriteResponse.Result.UPDATED == deleteResponse.getResult()){
                        log.info("删除成功");
                    }
                    break;
                default:break;
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}

测试方法:

按id删除单个文档

@Test
public void deleteDoc(){
    //先搜索一批文档
    int page =1;
    int size =1;
    System.out.println("===================先随便查询查询一个数据=========================");
    SearchHit[] hits = commodityServiceImpl.searchDoc(Article.class, "黄昏",(page-1)*size ,size,"content");
    log.info("hits的数量:{}",hits.length);
    ArrayList<String> list = new ArrayList<>(4);
    if(hits.length==0){
        log.info("没有查询到数据,先添加数据吧");
        return;
    }
    System.out.println("===================删除数据=========================");
    commodityServiceImpl.deleteById(Article.class.getSimpleName(), hits[0].getId());
    //暂停五秒
    try {
        Thread.sleep(5*1000L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("===================再次查询数据,确认删除是否成功=========================");
    SearchHit[] find_hits = commodityServiceImpl.findById(Article.class, hits[0].getId());
    log.info("find_hits的数量:{}",find_hits.length);
}

批量删除文档

@Test
public void deleteMultiDoc(){
    //先搜索一批文档
    int page =1;
    int size =10;
    System.out.println("===================查询数据=========================");
    SearchHit[] hits = commodityServiceImpl.searchDoc(Article.class, "物是人非",(page-1)*size ,size,"content");
    log.info("hits的数量:{}",hits.length);
    ArrayList<String> list = new ArrayList<>(16);
    if(hits.length>=1){
        for (SearchHit hit : hits) {
            list.add(hit.getId());
        }
    }else{
        log.info("没有查询到数据,先添加数据");
        return;
    }
    System.out.println("===================批量删除数据=========================");
    commodityServiceImpl.deleteMultiDoc(Article.class.getSimpleName(), list);
    //暂停五秒,等待数据删除之后再查询
    try {
        Thread.sleep(5*1000L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("===================再次查询数据,确认批量删除是否成功=========================");
    SearchHit[] find_hits = commodityServiceImpl.searchDoc(Article.class, "物是人非",(page-1)*size ,size,"content");
    log.info("find_hits的数量:{}",find_hits.length);
}


运行单个删除

===================先随便查询查询一个数据=========================
2019-09-21 15:38:17.143  INFO 280916 --- [           main] c.z.e.service.impl.ServiceImpl           : fieldName.length:1,fieldName:[content]
2019-09-21 15:38:17.419  INFO 280916 --- [           main] c.z.e.ElasticsearchDemoApplicationTests  : hits的数量:1
===================删除数据=========================
2019-09-21 15:38:17.466  INFO 280916 --- [           main] c.z.e.service.impl.ServiceImpl           : index:article; id:LjODT20Bk6nS0BLhTTX_,version:2
===================再次查询数据,确认删除是否成功=========================
2019-09-21 15:38:22.470  INFO 280916 --- [           main] c.z.e.ElasticsearchDemoApplicationTests  : find_hits的数量:0


运行批量删除删除

===================查询数据=========================
2019-09-21 15:38:57.497  INFO 282732 --- [           main] c.z.e.service.impl.ServiceImpl           : fieldName.length:1,fieldName:[content]
2019-09-21 15:38:57.849  INFO 282732 --- [           main] c.z.e.ElasticsearchDemoApplicationTests  : hits的数量:3
===================批量删除数据=========================
2019-09-21 15:38:58.026  INFO 282732 --- [           main] c.z.e.service.impl.ServiceImpl           : {"fragment":false,"id":"-jW4Um0Bk6nS0BLh5kJH","index":"article","primaryTerm":1,"result":"DELETED","seqNo":15,"shardId":{"fragment":true,"id":-1,"index":{"fragment":false,"name":"article","uUID":"_na_"},"indexName":"article"},"shardInfo":{"failed":0,"failures":[],"fragment":false,"successful":1,"total":1},"type":"_doc","version":3}
2019-09-21 15:38:58.026  INFO 282732 --- [           main] c.z.e.service.impl.ServiceImpl           : {"fragment":false,"id":"_TW4Um0Bk6nS0BLh5kKL","index":"article","primaryTerm":1,"result":"DELETED","seqNo":16,"shardId":{"fragment":true,"id":-1,"index":{"fragment":false,"name":"article","uUID":"_na_"},"indexName":"article"},"shardInfo":{"failed":0,"failures":[],"fragment":false,"successful":1,"total":1},"type":"_doc","version":3}
2019-09-21 15:38:58.027  INFO 282732 --- [           main] c.z.e.service.impl.ServiceImpl           : {"fragment":false,"id":"LzODT20Bk6nS0BLhTTX_","index":"article","primaryTerm":1,"result":"DELETED","seqNo":17,"shardId":{"fragment":true,"id":-1,"index":{"fragment":false,"name":"article","uUID":"_na_"},"indexName":"article"},"shardInfo":{"failed":0,"failures":[],"fragment":false,"successful":1,"total":1},"type":"_doc","version":5}
===================再次查询数据,确认批量删除是否成功=========================
2019-09-21 15:39:03.028  INFO 282732 --- [           main] c.z.e.service.impl.ServiceImpl           : fieldName.length:1,fieldName:[content]
2019-09-21 15:39:03.031  INFO 282732 --- [           main] c.z.e.ElasticsearchDemoApplicationTests  : find_hits的数量:0


都很简单

我的DEMO项目下载:https://gitee.com/zhuhongliang/soringboot_elastic_search_732.git

发表评论