es刪除操作大致分為:基於id的單條刪除、基於id的批量刪除、自定義條件的刪除
基於id的單條刪除:DeleteRequest
基於id的批量刪除:BulkRequest中通過多個DeleteRequest來裝載要刪除的數據
自定義條件刪除:
通過QueryBuilders中的termQuery(等值匹配)、rangeQuery(范圍匹配)、wildcardQuery(模糊匹配)指定搜索條件
通過QueryBuilders中的boolQuery中的should、must來設置and、or邏輯
通過DeleteByQueryRequest來構建刪除請求,setQuery來裝載條件,indices來指定索引
通過deleteByQuery來發起刪除請求(es也是先查詢后刪除)
單條刪除:
//es單條操作--刪除文檔(記錄) public String deleteEsDocument(){ //創建刪除文檔請求 DeleteRequest request = new DeleteRequest(); //設置屬性:指定要刪除的索引及id值 DeleteRequest delete = request.index("user").id("1001"); try { //像es服務發送請求 DeleteResponse deleteResult = this.client.delete(delete, RequestOptions.DEFAULT); System.out.println("delde es index result is : " + delete.toString()); } catch (IOException e) { e.printStackTrace(); } return "delete es index is complete"; }
批量刪除:
//批量刪除(單條件)public String bulkDeleteEsDocument(){ //獲取數據源 List<String> list = setTestData(); //創建批量操作請求 BulkRequest request = new BulkRequest(); int size = list.size(); for(int i=0; i<size; i++){ request.add(new DeleteRequest().index("user").id(list.get(i))); } BulkResponse delete = null; try { delete = this.client.bulk(request, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } System.out.println(delete.status()); return "bulk delete es document complete"; } //批量刪除的數據源 private static List<String> setTestData(){ List<String> objects = new ArrayList<>(); objects.add("sAMC7XgBrgVVHTXvmYL_"); objects.add("Pi6t6ngBdcbzHcXaH_iM"); return objects; }
自定義條件刪除:
//自定義刪除條件 @RequestMapping("/customDeleteCondition") public String customDeleteCondition(){ //設置刪除條件名字 == 張三 TermQueryBuilder userNameWhere = QueryBuilders.termQuery("userName.keyword", "張三"); //設置刪除條件體重》=10 《=100 RangeQueryBuilder weightRangeWhere = QueryBuilders.rangeQuery("weight"); weightRangeWhere.gte(10); weightRangeWhere.lte(100); //設置刪除條件模糊匹配名字中帶t的記錄 WildcardQueryBuilder userNameWildCardWhere = QueryBuilders.wildcardQuery("userName.keyword", "*r*"); //裝載條件並設置must == and should == or and、or根據業務需要自行調整 BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); queryBuilder.should(userNameWhere); queryBuilder.should(weightRangeWhere); queryBuilder.should(userNameWildCardWhere); DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest();//構建刪除請求 deleteByQueryRequest.setQuery(queryBuilder);//裝載刪除條件 deleteByQueryRequest.indices("user");//指定刪除索引 try { this.client.deleteByQuery(deleteByQueryRequest , RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } return "complete"; }
特殊情況:
針對map數據類型的自定義條件刪除
map數據類型在做刪除操作時比較特別須寫全標識,示例中scoure為字段歸屬標識,“數學”為字段名,keyword為分詞,99為值
個人猜想此處須單獨寫出scoure字段歸屬標識有兩個原因:1.此處刪除操作的條件是完全脫離實體類進行設置的。2.考慮到字段同名問題須特別指出要修改哪個“數學”
public void mapTestDelete(){ //map數據類型在做刪除操作時比較特別須寫全標識,示例中scoure為字段標識,“數學”為字段名,keyword為分詞,99為值 //設置刪除條件並裝載數據 BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); queryBuilder.must(QueryBuilders.termQuery("scoure.數學.keyword", "99")); DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest();//構建刪除請求 deleteByQueryRequest.setQuery(queryBuilder);//裝載刪除條件 deleteByQueryRequest.indices("map_test");//指定刪除索引 try { this.client.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } }