刪除文檔操作
@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); }
往往生產的需求是能夠類似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); }
上面的查詢刪除,在實際的生產中會占用大量的時間,所以為了不阻塞其他的操作,應該把上面的操作變成異步執行方式
/** * 優化--異步的方式執行 * */ @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("程序運行出錯"); } }); }