【SpringBoot笔记28】SpringBoot集成ES数据库之操作doc文档(创建、更新、删除、查询)

news2024/11/23 20:37:56

这篇文章,主要介绍SpringBoot集成ES数据库之操作doc文档(创建、更新、删除、查询)。

目录

一、SpringBoot操作ES文档数据

1.1、创建文档

1.2、更新文档

1.3、删除文档

1.4、查询文档

1.5、判断文档是否存在

1.6、批量创建文档


一、SpringBoot操作ES文档数据

ElasticSearch数据库中,所有的数据都是采用JSON格式来保存的,也叫做JSON文档,ES中的一条数据,就是一个JSON文档,一般叫做:doc文档。一个index索引下可以保存多个doc文档,每一个doc文档中的数据,保存的JSON格式可以相同、也可以不相同,一般实际开发过程中,相同索引下的doc文档结构都是相同的,因为这样可以提高ES的搜索效率。这里可以将ES中的doc文档看作是关系型数据库中的表记录,大致如下图所示。

下面具体介绍如何通过SpringBoot框架来操作doc文档。

1.1、创建文档

创建文档,需要通过【IndexRequest】请求对象,该对象需要指定index索引名称,以及文档id,文档id可以通过调用【id()】方法来指定,具体的doc文档数据内容通过【source()】方法来保存,该方法有多个重载格式。

注意:当文档id已经存在,再次创建重复的文档id,ES就会抛出异常。

具体案例代码:

package com.spring.boot.demo.controller;

import org.elasticsearch.action.DocWriteRequest;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.Map;

/**
 * @author ZhuYouBin
 * @version 1.0.0
 * @Date: 2022/11/21 22:45
 * @Description ES数据操作
 */
@RestController
@RequestMapping("/api/es/doc")
public class DocController {

    private static int seqNo = 1;

    @Autowired
    private RestHighLevelClient highRestClient;

    @PostMapping("/create")
    public String createDoc(@RequestBody Map<String, Object> map) throws IOException {
        // 创建索引请求: 指定操作doc数据保存到哪个索引下面,索引不存在,则会创建索引
        IndexRequest indexRequest = new IndexRequest("idx_20221121");
        // 指定doc文档的唯一id标识, 如果不指定,则ES会默认生成一个值
        indexRequest.id("2022112100" + (seqNo++));
        // 设置需要保存的数据,即:doc文档
        indexRequest.source(map);
        // 指定本次请求的操作类型,create 表示创建
        indexRequest.opType(DocWriteRequest.OpType.CREATE);
        // 执行请求
        IndexResponse response = highRestClient.index(indexRequest, RequestOptions.DEFAULT);
        // 处理响应结果
        DocWriteResponse.Result result = response.getResult();
        String lowercase = result.getLowercase();
        System.out.println("result: " + lowercase);
        return "success.";
    }

}

当doc文档创建完成后,可以通过【getResult()】方法获取结果对象,调用【getLowercase()】方法可以获取到小写的结果值,等于【created】表示doc文档创建成功。

1.2、更新文档

当创建的doc文档数据不正确时候,此时可以通过【UpdateRequest】来更新数据,通过【UpdateRequest】的构造方法来是指定index索引名称、以及doc文档的id,调用【doc()】方法设置更新的数据。

注意:当更新的doc文档id不存在,那么更新的时候就会抛出一个异常。

具体案例代码:

package com.spring.boot.demo.controller;

import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.Map;

/**
 * @author ZhuYouBin
 * @version 1.0.0
 * @Date: 2022/11/21 22:45
 * @Description ES数据操作
 */
@RestController
@RequestMapping("/api/es/doc")
public class DocController {

    @Autowired
    private RestHighLevelClient highRestClient;

    @PostMapping("/update")
    public String updateDoc(@RequestBody Map<String, Object> map, @RequestParam("id") String id) throws IOException {
        // 创建更新doc文档的请求: 指定操作哪个索引下的doc文档
        UpdateRequest updateRequest = new UpdateRequest("idx_20221121", id);
        // 设置需要保存的数据,即:doc文档
        updateRequest.doc(map);
        // 执行更新请求
        UpdateResponse response = highRestClient.update(updateRequest, RequestOptions.DEFAULT);
        // 处理响应结果
        DocWriteResponse.Result result = response.getResult();
        String lowercase = result.getLowercase();
        System.out.println("result: " + lowercase);
        return "success.";
    }

}

当doc文档更新成功后,可以通过【getResult()】方法获取结果对象,调用【getLowercase()】方法可以获取到小写的结果值,如果文档实际更新了,那么result就等于【updated】表示doc文档更新成功,如果等于【noop】则表示没有更新文档,两次文档内容是一致的。

1.3、删除文档

删除doc文档,是通过【DeleteRequest】请求对象,该构造方法中传递需要index索引名称和doc文档的id,这样ES才知道要删除哪一条数据。

注意:如果删除的doc文档id不存在,ES不会抛异常,这一点和创建、更新不一样,创建、更新时候,如果doc文档id不存在,都会抛异常

具体案例代码:

package com.spring.boot.demo.controller;

import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;

/**
 * @author ZhuYouBin
 * @version 1.0.0
 * @Date: 2022/11/21 22:45
 * @Description ES数据操作
 */
@RestController
@RequestMapping("/api/es/doc")
public class DocController {

    private static int seqNo = 1;

    @Autowired
    private RestHighLevelClient highRestClient;

    @PostMapping("/delete")
    public String deleteDoc(@RequestParam("id") String id) throws IOException {
        // 创建删除doc文档的请求: 指定删除哪个索引下的doc文档
        DeleteRequest deleteIndexRequest = new DeleteRequest("idx_20221122", id);
        // 执行删除请求
        DeleteResponse response = highRestClient.delete(deleteIndexRequest, RequestOptions.DEFAULT);
        // 处理响应结果
        DocWriteResponse.Result result = response.getResult();
        String lowercase = result.getLowercase();
        System.out.println("result: " + lowercase);
        return "success.";
    }

}

删除成功,那么【getResult()】会返回【deleted】,没有找到删除的doc文档id,此时会返回【not_found】。

1.4、查询文档

查询文档需要通过【GetRequest】请求对象,调用【get()】方法之后,会返回一个【GetResponse】对象,这个响应对象提供了如下方法:

其中,可以getSource开头的方法,就是doc文档的具体数据。

注意:没有查询到指定的doc文档,getSource则返回的是null。

具体案例代码:

package com.spring.boot.demo.controller;

import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.Map;

/**
 * @author ZhuYouBin
 * @version 1.0.0
 * @Date: 2022/11/21 22:45
 * @Description ES数据操作
 */
@RestController
@RequestMapping("/api/es/doc")
public class DocController {

    private static int seqNo = 1;

    @Autowired
    private RestHighLevelClient highRestClient;

    @GetMapping("/get")
    public String getDoc(@RequestParam("id") String id) throws IOException {
        // 创建删除doc文档的请求: 指定查询哪个索引下的doc文档
        GetRequest getRequest = new GetRequest("idx_20221122", id);
        // 执行删除请求
        GetResponse response = highRestClient.get(getRequest, RequestOptions.DEFAULT);
        // 处理响应结果: 获取doc文档数据
        Map<String, Object> source = response.getSource();
        System.out.println(source);
        return "success.";
    }

}

1.5、判断文档是否存在

判断文档是否存在,也需要通过【GetRequest】请求对象,然后调用【exists()】方法即可。

package com.spring.boot.demo.controller;

import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;

/**
 * @author ZhuYouBin
 * @version 1.0.0
 * @Date: 2022/11/21 22:45
 * @Description ES数据操作
 */
@RestController
@RequestMapping("/api/es/doc")
public class DocController {

    private static int seqNo = 1;

    @Autowired
    private RestHighLevelClient highRestClient;

    @GetMapping("/exists")
    public String existsDoc(@RequestParam("id") String id) throws IOException {
        // 创建删除doc文档的请求: 指定查询哪个索引下的doc文档
        GetRequest getRequest = new GetRequest("idx_20221122", id);
        // 因为这里只是判断doc文档存不存在,没必要查询具体的数据内容,所以可以指定不返回数据内容
        getRequest.fetchSourceContext(new FetchSourceContext(false));
        // 执行删除请求
        boolean exists = highRestClient.exists(getRequest, RequestOptions.DEFAULT);
        // 处理响应结果
        System.out.println("doc文档是否存在: " + exists);
        return "success.";
    }

}

1.6、批量创建文档

前面介绍的都是单条文档的创建,ES也支持批量创建文档,通过【BulkRequest】请求对象封装多条doc文档数据,然后调用【bulk()】方法执行批量操作即可。

注意:bulk执行批量更新的时候,第一次创建doc文档时候,返回的201状态码,之后更新doc文档的时候,是返回200状态码。

具体案例代码:

package com.spring.boot.demo.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.spring.boot.demo.pojo.User;
import org.elasticsearch.action.bulk.BulkItemResponse;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
//import java.util.Map;

/**
 * @author ZhuYouBin
 * @version 1.0.0
 * @Date: 2022/11/21 22:45
 * @Description ES数据操作
 */
@RestController
@RequestMapping("/api/es/doc")
public class DocController {

    private static int seqNo = 1;

    @Autowired
    private RestHighLevelClient highRestClient;

    @GetMapping("/bulk")
    public String bulkDoc() throws IOException {
        // 创建批量请求
        BulkRequest bulkRequest = new BulkRequest();
        // 模拟数据
        for (int i = 0; i < 10; i++) {
            IndexRequest indexRequest = new IndexRequest("idx_20221122");
            indexRequest.id("doc_id00" + i); // 设置doc文档的id
            User user = new User("test-name-00" + i, "abcd00100" + i, 20 + i);
            ObjectMapper objectMapper = new ObjectMapper();
            String json = objectMapper.writeValueAsString(user);
            indexRequest.source(json, XContentType.JSON);
            // 添加到bulk里面
            bulkRequest.add(indexRequest);
        }
        // 批量执行创建请求
        BulkResponse response = highRestClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        // 处理响应结果
        boolean hasFailures = response.hasFailures();
        if (hasFailures) {
            System.out.println("批量创建文档失败");
        }
        // 获取每一个请求响应
        BulkItemResponse[] responseItems = response.getItems();
        for (BulkItemResponse responseItem : responseItems) {
            int status = responseItem.status().getStatus();
            // bulk批量操作时候,第一次创建doc文档,返回的201状态码
            // 之后更新文档,是返回200状态码
            if (status != 200 && status != 201) {
                System.out.println("status=" + status + ",执行失败,id=" + responseItem.getId());
            } else {
                System.out.println("status=" + status + ",执行成功,id=" + responseItem.getId());
            }
        }
        return "success.";
    }

}

运行结果如下所示:

到此,SpringBoot框架操作ES文档数据就介绍完啦。

综上,这篇文章结束了,主要介绍SpringBoot集成ES数据库之操作doc文档(创建、更新、删除、查询)。

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

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

相关文章

高手系列!数据科学家私藏pandas高阶用法大全 ⛵

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 数据分析实战系列&#xff1a;https://www.showmeai.tech/tutorials/40 &#x1f4d8; 本文地址&#xff1a;https://www.showmeai.tech/article-detail/394 &#x1f4e2; 声明&#xff1a;版权所有&#xff0c;转…

CubeMX+VSCode+Ozone的STM32开发工作流(二)VSCode环境配置

neozng1hnu.edu.cn 本教程的示例代码是笔者参加RoboMaster机甲大师赛为机器人编写的控制器框架&#xff0c;你可以直接克隆仓库&#xff0c;阅读仓库下的Markdown文档获得更好的体验&#xff0c;记得点一个小⭐: basic_framework: basic_framework (gitee.com)所有安装包也可以…

OceanBase TableAPI实践案例(Rust)

引子 这是OceanBase TableAPI实践案例&#xff08;Java&#xff09;的姊妹篇&#xff0c;上一篇比较全面的比较全面的介绍了TableAPI的相关概念&#xff0c;以及基本的环境搭建&#xff0c;因此这篇不再赘述。本文将主要介绍TableAPI的Rust客户端obkv-table-client-rs &#x…

Visio画图更改连接线的弧形和调整跨线

目录前言准备参考问题解决问题一解决问题二前言 最近在使用Visio画图时&#xff0c;出现了一些问题&#xff0c;于是上网查了一下&#xff0c;将方法记录下来。 准备 Visio2021 参考 Visio中&#xff0c;如何修改连接线的跨线样式&#xff1f; 问题 (1) 使用连接线的时候…

【微信小程序】使用 Cryptojs 解密微信绑定手机号码

很抱歉断更了一段时间&#xff0c;因为最近在做一个项目比较忙&#xff0c;正好项目中小程序板块需要解密手机号码来提交给接口&#xff0c;小程序中虽然提供了获取手机号按钮点击事件&#xff1a;bindgetphonenumber&#xff0c;但是该事件的处理函数中只能获取到加密过的手机…

新力量,新希望|明道云伙伴大会2022秋圆满落幕

2022年10月28日至29日&#xff0c;明道云伙伴大会&#xff08;2022年秋&#xff09;在上海顺利举办。来自北京大兴国际机场、广汽本田、京东方、天津钢管、深圳龙华区卫健局、可口可乐、山东移动、浙江移动、上海电气数科、金科信息、艾默生电气等超过五百位参会者同台交流。行…

工业物联网的数据集成

随着网关技术的不断发展&#xff0c;创新、高效的软件解决方案及IT架构在工业物联网系统架构中将发挥着更为重要的作用。其中&#xff0c;工业物联网集成工业数据的一个关键问题在于如何利用软件、IT和创新算法来部署网络解决方案&#xff0c;从而使得生产效率更高。 &#xff…

Java中 this 和 super 的用法与区别

在Java的学习与开发者我们经常遇到this和super关键字&#xff0c;那么它们的用法和区别是什么呢&#xff1f; 一、this关键字 1.this是什么&#xff1f; this 是自身的一个对象&#xff0c;代表对象本身&#xff0c;可以理解为&#xff1a;指向对象本身的一个指针。 2.this…

javaScript之数组中reduce的详细介绍及使用

一、reduce功能接受及定义&#xff08;自我理解&#xff09; reduce方法为数组中的一个高阶函数&#xff0c;接受两个参数&#xff0c;第一个参数为回调函数&#xff0c;第二个为初始值。如果不给入初始值则会以数组第一项为初始值&#xff01;reduce会循环数组每一项&#xf…

数据库-深度剖析mysql索引原理(上)(三)

目录 一、什么是索引 二、索引由来 三、索引本质 四、索引数据结构 1、hsah 2、Btree 五、myISAM 和Innodb这两个数据库的索引是如何实现的呢&#xff1f; 1、首先看 MYSAM 1、以主键Id字段建立索引 2、以name字段来建立索引 2、在看Innodb数据库引擎的数据库 1、以…

Linux安装Jenkins详细步骤

安装jdk yum安装不需要配置环境变量 安装maven 下载maven 压缩包上传至服务器 解压缩 修改maven配置文件镜像地址 配置环境变量 安装Git 安装Jenkins war包下载 安装运行Jenkins 安装jdk 【Linux】Linux8 安装 JDK&#xff08;适用于各个版本&#xff09;_写bug的程…

JavaScript 数值 Number

目录1 数值 number1.1 数值储存1.2 数值表示1.2.1 数值分隔符1.3 特殊数值1.3.1 正零和负零1.3.2 NaN1.3.3 Infinity1.4 数值相关的全局方法1.5 Number 对象1.5.1 Number()1.5.2 Number 静态属性1.5.3 Number 静态方法1.5.4 Number 实例方法1.5.5 自定义方法1.6 Math 对象1.6.1…

ev-MOGA多目标进化算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

如何在 Windows 10 中安装 Azure Data Studio 1.39.1

安装 Azure Data Studio 1.39.1 官网下载 Azure Data Studio 1.39.1安装 Azure Data Studio 1.39.1Azure Data Studio 是一个跨平台数据库工具,适用于在 Windows、macOS 和 Linux 上使用本地和云数据平台的数据专业人员。 Azure Data Studio 提供了 IntelliSense、代码片段、源…

Java实现基于RSA的数字签名

加密与数字签名的区别 1、加密保证了数据接受方的数据安全性。加密的作用是防止泄密。 2、签名保证了数据发送方的数据安全性。签名的作用是防止篡改。 数字签名的应用 问题&#xff1a;在比特币中&#xff0c;怎么证明这个交易是你发布的&#xff1f; 这是就需要用到数字…

客户关系应该如何管理?

网络经过十多年的产业发展&#xff0c;中国的网络用户已经超过了8亿&#xff0c;网络也渐渐改变了盲目的商业价值追求&#xff0c;趋于稳定理性&#xff0c;已经开始向着多个路径全面性产业发展。网络上出现了各式各样的网络营销方式&#xff0c;如邮件网络营销、广告行业、浏览…

【python实战】朋友因股票亏了,很惨常愤恨不平,当天我就分析出原因:怎么做到的?(听说关注我的人会暴富)

导语 有温度 有深度 有广度 就等你来关注哦~ 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 对于大部分股票投资者来说&#xff0c;一年能拿住翻倍的股票就实属不易。一年10倍&#xff0c;甚至…

生物素标记肽Biotin-εAhx-GLKLRFEFSKIKGEFLKTPEVRFRDIKLKDN

编号: 162943中文名称: 生物素标记肽Biotin-εAhx-GLKLRFEFSKIKGEFLKTPEVRFRDIKLKDN英文名: Biotin-εAhx-Gly-Leu-Lys-Leu-Arg-Phe-Glu-Phe-Ser-Ly英文同义词: Biotinyl-LC-hCAP-18 (134-170) (Scrambled), Biotinyl-LC-Cationic Antimicrobial Protein 18 (134-170) (human) …

hi mate, lets recall the bloody “JOIN“

补补数据库基础 上图中&#xff0c;表A的记录是123&#xff0c;表B的记录是ABC&#xff0c;颜色表示匹配关系。返回结果中&#xff0c;如果另一张表没有匹配的记录&#xff0c;则用null填充。 注意&#xff1a;多表连接查询会比直接使用自带的API查询表中的一个属性&#xff0…

基于STM32单片机的智能窗帘系统

本设计是基于STM32单片机的智能窗帘系统&#xff0c;主要实现以下功能&#xff1a; 1、 定时模式&#xff1a;早上&#xff08;7:00&#xff09;自动打开窗帘&#xff0c;晚上&#xff08;19&#xff1a;00&#xff09;自动关闭窗帘。 2、 手动模式&#xff1a;通过按键实现对…