Elasticsearch(七)--ES文档的操作(下)---删除文档

news2024/11/15 11:13:34

一、前言

上篇文章我们了解了ES的修改文档的操作,也同样分别通过ES的kibana客户端以及Java高级Rest客户端进行学习,那么本篇末尾要给大家介绍的是对文档的删除操作,同新修改文档,也有删除单条文档和批量删除文档操作,根据条件删除文档,我们本篇均会涉及到。

二、删除文档

2.1、删除单条文档

在ES中删除文档的请求的类型是DELETE,其请求的形式如下:

DELETE /${index_name}/_doc/${_id}

上面的_id就是将要删除的ES文档的_id。执行下面的删除命令:

DELETE /hotel/_doc/021

返回的结果如下:
在这里插入图片描述
通过结果可知,已经成功删除文档,之前添加的文档已经不存在了。我们可以通过下面的根据_id搜索文档的命令进行验证:

GET /hotel/_doc/021

ES返回结果如下:
在这里插入图片描述
由返回的结果可知,删除已经生效。
在Java高级REST客户端中,执行删除文档需要创建DeleteRequest对象并设置对应的索引名称和删除文档的_id,然后执行客户端的delete()方法并把DeleteRequest对象传入即可。以下代码演示了根据_id删除文档的方法。
首先同修改一样,我们需要建立一个专门处理删除逻辑的service,记得引入client:

public String singleDelete(String indexName, String docId) {
		if (CharSequenceUtil.isBlank(indexName)) {
			throw new SearchException("索引名不能为空");
		}
		DeleteRequest deleteRequest = new DeleteRequest(indexName, docId);
		try {
			DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
			return deleteResponse.toString();
		} catch (IOException e) {
			throw new SearchException("删除服务错误");
		}
	}

接着controller层调用service:

    @PostMapping("/single/delete")
	public FoundationResponse<String> singleDelete(String indexName, String docId) {
		try {
			String result = esDeleteDocService.singleDelete(indexName, docId);
			return FoundationResponse.success(result);
		} catch (SearchException e) {
			log.warn("搜索发生异常,原因为:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		} catch (Exception e) {
			log.error("服务发生异常,原因为:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		}
	}

然后postman调用该接口:
在这里插入图片描述

2.2、批量删除文档

与批量写入和更新文档不同的是,批量删除文档不需要提供JSON数据,其请求形式如下:

POST /_bulk
{"delete":{"_index":"${index_name}","_id":"${_id}"}}
{"delete":{"_index":"${index_name}","_id":"${_id}"}}

例如,下面的DSL将批量删除_id为002,003,004的文档:

POST /_bulk
{"delete":{"_index":"hotel_order","_id":"004"}}
{"delete":{"_index":"hotel_order","_id":"002"}}
{"delete":{"_index":"hotel_order","_id":"003"}}

和批量写入修改文档相似,在Java客户端接口中,批量删除文档同样需要创建BulkRequest对象并设置对应的索引名称。对于多条需要删除的文档,可构建多个DeleteRequest对象并调用BulkRequest.add()方法添加这些DeleteRequest对象,执行时,调用客户端的bulk()方法并把BulkRequest对象传入即可。
首先Service层代码如下,我们通过接收前端传的需要批量删除的id的list进行批量删除,并且模拟的是删除同一个索引下的多个文档:

public String bulkDelete(HotelDocRequest hotelDocRequest) {
		String indexName = hotelDocRequest.getIndexName();
		if (CharSequenceUtil.isBlank(indexName)) {
			throw new SearchException("索引名不能为空");
		}
		List<String> docIds = hotelDocRequest.getHotelList().stream().map(Hotel::getId).collect(Collectors.toList());
		BulkRequest bulkRequest = new BulkRequest();
		for (String docId : docIds) {
	        //创建DeleteRequest
			DeleteRequest deleteRequest = new DeleteRequest(indexName, docId);
			bulkRequest.add(deleteRequest);
		}
		BulkResponse bulkResponse;
		try {
		    //执行批量删除
			bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
			if (bulkResponse.hasFailures()) {
				return "失败,原因:" + bulkResponse.buildFailureMessage();
			} else {
				return "成功";
			}
		} catch (IOException e) {
			throw new SearchException("批量修改服务错误");
		}
	}

controller调用Service层:

    @PostMapping("/bulk/delete/doc")
	public FoundationResponse<String> bulkDelete(@RequestBody HotelDocRequest hotelDocRequest) {
		List<Hotel> hotelList = hotelDocRequest.getHotelList();
		if (CollUtil.isEmpty(hotelList)) {
			return FoundationResponse.error(100, "无可修改的有效文档");
		}
		try {
			String s = esDeleteDocService.bulkDelete(hotelDocRequest);
			return FoundationResponse.success(s);
		} catch (SearchException e) {
			log.warn("批量删除发生异常,原因为:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		} catch (Exception e) {
			log.error("服务发生异常,原因为:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		}
	}

postman调用该接口,body如下:

{
    "hotelList": [
        {
            "id": "001"
        },
        {
            "id": "002"
        }
    ],
    "indexName":"hotel"
}

返回结果如下:
在这里插入图片描述
2.3、根据条件删除文档
和条件更新操作类似,有些场景需要根据某些条件同时删除多条数据,类似于在关系型数据库中使用delete table_name where… 删除一批数据。为了满足这样的需求,ES为用户提供了_delete_by_query功能,其请求形式如下:

POST /hotel/_delete_by_query
{
  "query":{
      ...  //删除文档的查询条件
  }
}

query子句用于指定删除数据的匹配条件,相当于SQL中的where语句。下面的DSL将把city为成都的文档删除:

POST /hotel/_delete_by_query
{
  "query":{
    "term":{
      "city":{
        "value":"成都"
      }
    }
  }
}

在java高级REST客户端中,执行条件删除文档需要创建DeleteByQueryRequest对象并设置对应的索引名称类似于DSL中的query子句,通过调用DeleteByQueryRequest.setQuery()方法设置查询逻辑,然后执行客户端的deleteByQuery()方法并把DeleteByQueryRequest对象传入即可。以下代码演示了根据城市删除文档的方法:
Service层:

public String deleteByCity(String indexName, String city) {
		DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(indexName);
		deleteByQueryRequest.setQuery(new TermQueryBuilder("city", city));
		try {
			BulkByScrollResponse response = client.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT);
			return response.toString();
		} catch (IOException e) {
			throw new SearchException("按照条件修改服务错误");
		}
	}

controller调用service:

	@PostMapping("/delete/byCity")
	public FoundationResponse<String> updatePriceByQueryCity(String indexName, String city) {
		if (CharSequenceUtil.isBlank(indexName)) {
			throw new SearchException("索引名不能为空");
		}
		try {
			String result = esDeleteDocService.deleteByCity(indexName, city);
			return FoundationResponse.success(result);
		} catch (SearchException e) {
			log.warn("搜索发生异常,原因为:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		} catch (Exception e) {
			log.error("服务发生异常,原因为:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		}
	}

postman调用该接口:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工赋开发者社区 | 工业5.0为何是下一个10年的制造业关键性变革方向?

近年来&#xff0c;全球经济发展面临下行压力&#xff0c;世界各国重新认识到制造业在拉动经济增长、创造就业机会等方面的作用。欧洲在这种压力下提出了全新的工业5.0发展概念&#xff0c;试图重振制造业并再次引领全球工业发展潮流。本文小编分享一篇来自KNOWHOW的文章&#…

【地铁上的Redis与C#】数据类型(八)--set类型基本操作

这篇文章&#xff0c;我们开始学习set类型&#xff0c;学习set类型前我们先来看一下List类型有什么缺点。 List的缺点 当需要存储大量数据并且要提供高效率的查询时&#xff0c;List是无法完全实现的&#xff0c;这是因为list的存储结构是链表的形式&#xff0c;链表读取数据…

Leetcode力扣秋招刷题路-0114

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 114. 二叉树展开为链表&#xff08;Mid&#xff09; 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中…

Linux- 系统随你玩之--文本、字符串处理摸金校尉--RE

文章目录1、前言2、正则表达式2.1、 概述2.2、 特点2.3、正则表达式-测试工具3、知识点3.1、 正则表达式定义3.2、 正则表达式的组成3.3、正则表达式语法支持情况4、速记理解技巧4.1、基础正则表达式4.2、等价4.3、常用运算符与表达式4.4、分割语法4.4.1、例型4.4.2、例型语法与…

Java高手速成 | JSP MVC模式项目案例

MVC模式的核心思想是有效地组合“视图”“模型”和“控制器”。在JSP 技术中&#xff0c;视图是一个或多个JSP页面&#xff0c;其作用主要是向控制器提交必要的数据和为模型提供数据显示&#xff1b;模型是一个或多个Javabean对象&#xff0c;用于存储数据&#xff1b;控制器是…

LifeCycle源码解析

简介 Lifecycle是Jetpack中的一个生命周期组件&#xff0c;可用来感知其他组件&#xff08;如Activity&#xff0c;Fragment&#xff09;生命周期的变化&#xff0c;从而可以保证我们的一些代码操作控制在合理的生命周期内&#xff1b; 如何使用&#xff1f; 添加以下依赖 …

什么是接口、接口测试、接口自动化测试、你分的清楚吗?

目录 前言&#xff1a; 服务端接口测试介绍 什么是服务端&#xff1f; 什么是接口&#xff1f; 什么是接口测试&#xff1f; 为什么要做接口测试&#xff1f; 如何做接口测试&#xff1f; 接口测试自动化介绍 为什么是接口测试自动化&#xff1f; 为什么要做接口测试自…

什么是动态域名解析?域名怎么解析到内网IP

首先说说什么是域名解析&#xff0c;域名解析就是把域名解析成一个ip地址&#xff0c;我们大多数人都喜欢记忆域名&#xff0c;但是机器只认识IP地址&#xff0c;把这个IP地址对应相关域名&#xff0c;这就叫域名解析。动态域名与动态域名解析是相互关联的关系&#xff0c;通过…

项目图床选择

总结&#xff1a; 非隐私图片&#xff1a;使用Github、七牛云(http)、SM.MS图床、路过图床。隐私图片&#xff1a;使用阿里云OSS、七牛云(https)&#xff08;绑定的域名不能丢&#xff09;。 测试环境&#xff08;日常使用&#xff09;自行选择&#xff1b; 生产环境选择阿里云…

03_PyTorch 模型训练[Dataset 类读取数据集]

PyTorch 读取图片&#xff0c;主要是通过 Dataset 类&#xff0c;所以先简单了解一下 Dataset 类。Dataset 类作为所有的 datasets 的基类存在&#xff0c;所有的 datasets 都需要继承它&#xff0c;类似于 C中的虚基 类。这里重点看 getitem 函数&#xff0c;getitem 接收一个…

微信小程序使用canvas生成分享海报功能复盘

前言 近期需要开发一个微信小程序生成海报分享的功能。在h5一般都会直接采用 html2canvas 或者 dom2image 之类的库直接处理。但是由于小程序不具备传统意义的dom元素&#xff0c;所以也没有办法采用此类工具。 所以就只能一笔一笔的用 canvas 画出来了&#xff0c;下面对实现…

(文末有彩蛋,不看白不看)兑现一下之前答应读者的事

大家过年好呀&#xff01;&#xff08;我&#xff09;明天就要开工上班啦&#xff01;在假期的最后一天踢了会球&#xff0c;简单吃点东西&#xff0c;晚上来兑现答应一位读者的事情。开整&#xff01; 前情提要 这篇文章缘起于「开发者」技术交流群中一位读者遇到的问题&…

《树上的男爵》坚持解释不清的理想是疏离,还是自由?

《树上的男爵》坚持解释不清的理想是疏离&#xff0c;还是自由&#xff1f; 伊塔洛卡尔维诺&#xff0c;意大利作家&#xff0c;后现代主义派。 卡尔维诺为“寓言式奇幻文学的大师”。&#xff08;评论家赫伯特密特甘评&#xff09; 吴正仪 译 许多年来&#xff0c;我为一些连我…

【3】SpringBoot基础

//从事微服务开发工作 SpringBoot提供一种快速使用Spring的方式 1、自动化 2、设置多个starter配置依赖比Maven直接管理更便捷 3、内置服务器 总结&#xff1a;自动配置&#xff0c;起步依赖&#xff0c;辅助功能 2.6.11版本的说明书 Spring Boot Reference Documentation…

第九层(8):STL之set/multiset

文章目录前情回顾set/multiset概念区别构造函数赋值函数大小操作函数交换函数插入函数删除函数查找函数统计函数为什么set不可以插入重复数据pair数组pair数组创建怎么样去改变set容器的排序规则下一座石碑&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一…

智公网:一级消防师要掌握的知识点!

一、建筑物的耐火等级 1、建筑物的耐火等级分为四级&#xff0c;一、二、三、四级。 2、节点缝隙或金属承重构件节点的外露部位&#xff0c;应做防火保护层。 3、民用建筑的耐火等级、层数、长度和面积&#xff0c;一二级最大防火分区的长度250m。多层建筑最大允许建筑面积2…

【gcc/g++/gdb/cmake】命令

文章目录参考资料一、gcc/g/make1 gcc和g的区别2 gcc/g与make区别3 make与cmake区别二、开发环境搭建1 编译器&#xff0c;调试器&#xff0c;CMake安装2 GCC编译器2.1 编译过程2.1.1 -E 预处理-Pre-Processing .i文件2.1.2 -S 编译-Compiling .s文件2.1.3 -C 汇编-Assembling …

软件工程(二)——需求工程、统一建模语言UML

目录 一、需求获取 二、需求分析 1.结构化需求分析 2.面向对象分析方法OOA 三、UML 41视图 四、UML 图 (1)用例图 (2)类图、对象图 (3)顺序图 &#xff08;4&#xff09;活动图 &#xff08;5&#xff09;状态图 &#xff08;6&#xff09;通信图 软件需求指用户对系…

【科研】ET-BERT代码分析

0. 数据集 论文使用的TLS1.3数据集是从 2021 年 3 月到 2021 年 7 月在中国科技网 (CSTNET) 上收集的。 如果要使用自己的数据集的话&#xff0c;需要检查数据格式是否与datasets/cstnet-tls1.3/目录下一致&#xff0c;并且在data_process/目录下指定数据集路径。 用于微调的…

Pomotroid 使用指南:一款高颜值 PC 端番茄时钟

文章首发于个人公众号&#xff1a;「阿拉平平」 番茄工作法作为一套高效易行的时间管理方案&#xff0c;是由意大利人弗朗西斯科西里洛于 1992 年创立的。作者发明的初衷源自于自身严重的拖延症&#xff0c;于是他找来一个厨房用的番茄计时器&#xff0c;调到 10 分钟&#xff…