首页 > 技术文章 > es之java删除文档操作

niutao 2017-05-22 23:22 原文

删除文档操作

@Test
public void deleteDocument(){
    DeleteResponse response = client.prepareDelete("twitter4", "tweet", "1").get();
    // 索引名称
    String _index = response.getIndex();
    // 类型
    String _type = response.getType();
    // 文档ID
    String _id = response.getId();
    // 版本
    long _version = response.getVersion();
    // 返回的操作状态
    RestStatus status = response.status();
    System.out.println("索引名称:"+_index+" "+"类型 :" +  _type + " 文档ID:"+_id+" 版本 :"+_version+" 返回的操作状态:"+status);
}

2:通过查询的方式删除

往往生产的需求是能够类似mysql一样,通过查询出符合条件的数据进行删除:

比如mysql:

DELETE FROM Employees WHERE ps_code= 
(SELECT ps_code 不存在 FROM Employees WHERE ps_code NOT IN `icq_user_info``persons`
(SELECT ps_code FROM Persons));

那么es也是支持这种操作的:DeleteByQueryAction允许检索一个索引,把匹配出来的字段删除

@Test
public void queryDeleteDocument(){
    BulkByScrollResponse response =
            DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
                    .filter(QueryBuilders.matchQuery("user", "tom"))//key -- value
                    .source("twitter4")//索引名称
                    .get();

    long deleted = response.getDeleted();
    System.out.println("总共删除时间:"+deleted);
}

3: 优化-通过查询进行删除

上面的查询删除,在实际的生产中会占用大量的时间,所以为了不阻塞其他的操作,应该把上面的操作变成异步执行方式

/**
 * 优化--异步的方式执行
 * */
@Test
public void tuningqueryDeleteDocument(){
    DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
            .filter(QueryBuilders.matchQuery("user", "kimchy"))
            .source("twitter4")
            .execute(new ActionListener<BulkByScrollResponse>() {
                public void onResponse(BulkByScrollResponse response) {
                    long deleted = response.getDeleted();
                    System.out.println("总共删除时间:"+deleted);//因为是异步执行,所以不会打印
                }
                public void onFailure(Exception e) {
                    System.out.println("程序运行出错");
                }

            });

}

 

推荐阅读