当前位置: 首页 > news >正文

【Elasticsearch】RestClient操作文档

RestClient操作文档

  • 新增文档
    • 实体类
    • API语法
  • 查询文档
  • 删除文档
  • 修改文档
  • 批量导入文档
  • 小结

新增文档

将数据库中的信息导入elasticsearch中
以商品数据为例

实体类

定义一个索引库结构对应的实体。

@Data
@ApiModel(description = "索引库实体")
public class ItemDoc{@ApiModelProperty("商品id")private String id;@ApiModelProperty("商品名称")private String name;@ApiModelProperty("价格(分)")private Integer price;@ApiModelProperty("商品图片")private String image;@ApiModelProperty("类目名称")private String category;@ApiModelProperty("品牌名称")private String brand;@ApiModelProperty("销量")private Integer sold;@ApiModelProperty("评论数")private Integer commentCount;@ApiModelProperty("是否是推广广告,true/false")private Boolean isAD;@ApiModelProperty("更新时间")private LocalDateTime updateTime;
}

API语法

新增文档的请求语法如下:

POST /{索引库名}/_doc/1
{"name": "Jack","age": 21
}

对应的JavaAPI如下:

   @Testvoid createIndex() throws IOException {//1.准备文档 Item item = itemService.getById("4294760");log.info(item.getId().toString());ItemDoc itemDoc = BeanUtil.copyProperties(item, ItemDoc.class);//1.准备RequestIndexRequest request = new IndexRequest("items").id(itemDoc.getId());//2.准备请求参数request.source(JSONUtil.toJsonStr(itemDoc), XContentType.JSON);//3.发送请求client.index(request,RequestOptions.DEFAULT);}

导入商品数据,还需要做几点准备工作:

  • 商品数据来自于数据库,我们需要先查询出来,得到Item对象
  • Item对象需要转为ItemDoc对象
  • ItemDTO需要序列化为json格式
    代码整体步骤如下:
  • 1)根据id查询商品数据Item
  • 2)将Item封装为ItemDoc
  • 3)将ItemDoc序列化为JSON
  • 4)创建IndexRequest,指定索引库名和id
  • 5)准备请求参数,也就是JSON文档
  • 6)发送请求

可以看到与索引库操作的API非常类似,同样是三步走:

  • 1)创建Request对象,这里是IndexRequest,因为添加文档就是创建倒排索引的过程
  • 2)准备请求参数,本例中就是Json文档
  • 3)发送请求

查询文档

我们以根据id查询文档为例
查询的请求语句如下:

GET /{索引库名}/_doc/{id}

与之前的流程类似,代码大概分2步:

  • 创建Request对象
  • 准备请求参数,这里是无参,直接省略
  • 发送请求

响应结果是一个JSON,其中文档放在一个_source属性中,因此解析就是拿到_source,反序列化为Java对象即可。

其它代码与之前类似,流程如下:

  • 1)准备Request对象。这次是查询,所以是GetRequest
  • 2)发送请求,得到结果。因为是查询,这里调用client.get()方法
  • 3)解析结果,就是对JSON做反序列化
    @Testvoid getIndex() throws IOException {//1.准备RequestGetRequest request = new GetRequest("items","4294760");//2.发送请求GetResponse response = client.get(request, RequestOptions.DEFAULT);//3.解析结果ItemDoc bean = JSONUtil.toBean(response.getSourceAsString(), ItemDoc.class);log.info(bean.toString());}

删除文档

删除的请求语句如下:

DELETE /hotel/_doc/{id}

与查询相比,仅仅是请求方式从DELETE变成GET,可以想象Java代码应该依然是2步走:

  • 1)准备Request对象,因为是删除,这次是DeleteRequest对象。要指定索引库名和id
  • 2)准备参数,无参,直接省略
  • 3)发送请求。因为是删除,所以是client.delete()方法

在item-service的DocumentTest测试类中,编写单元测试:

@Test
void testDeleteDocument() throws IOException {// 1.准备Request,两个参数,第一个是索引库名,第二个是文档idDeleteRequest request = new DeleteRequest("items", "4294760");// 2.发送请求client.delete(request, RequestOptions.DEFAULT);
}

修改文档

修改我们讲过两种方式:

  • 全量修改:本质是先根据id删除,再新增
  • 局部修改:修改文档中的指定字段值

在RestClient的API中,全量修改与新增的API完全一致,判断依据是ID:

  • 如果新增时,ID已经存在,则修改
  • 如果新增时,ID不存在,则新增

这里不再赘述,我们主要关注局部修改的API即可。
局部修改的请求语法如下:

POST /{索引库名}/_update/{id}
{"doc": {"字段名": "字段值","字段名": "字段值"}
}

与之前类似,也是三步走:

  • 1)准备Request对象。这次是修改,所以是UpdateRequest
  • 2)准备参数。也就是JSON文档,里面包含要修改的字段
  • 3)更新文档。这里调用client.update()方法
@Test
void testUpdateDocument() throws IOException {// 1.准备RequestUpdateRequest request = new UpdateRequest("items", "4294760");// 2.准备请求参数request.doc("price", 58800,"commentCount", 1);// 3.发送请求client.update(request, RequestOptions.DEFAULT);
}

批量导入文档

批处理与前面讲的文档的CRUD步骤基本一致:

  • 创建Request,但这次用的是BulkRequest
  • 准备请求参数
  • 发送请求,这次要用到client.bulk()方法

BulkRequest本身其实并没有请求参数,其本质就是将多个普通的CRUD请求组合在一起发送。例如:

  • 批量新增文档,就是给每个文档创建一个IndexRequest请求,然后封装到BulkRequest中,一起发出。
  • 批量删除,就是创建N个DeleteRequest请求,然后封装到BulkRequest,一起发出
  @Testvoid testBulkIndex() throws IOException {BulkRequest request = new BulkRequest();request.add(new IndexRequest("items","4294760"));
//        ...省略重复操作request.add(new DeleteRequest("items", "429476X"));BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);}

小结

文档操作的基本步骤:

  • 初始化RestHighLevelClient
  • 创建XxxRequest。
    • XXX是Index、Get、Update、Delete、Bulk
  • 准备参数(Index、Update、Bulk时需要)
  • 发送请求。
    • 调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete、bulk
  • 解析结果(Get时需要)

相关文章:

【Elasticsearch】RestClient操作文档

RestClient操作文档 新增文档实体类API语法 查询文档删除文档修改文档批量导入文档小结 新增文档 将数据库中的信息导入elasticsearch中 以商品数据为例 实体类 定义一个索引库结构对应的实体。 Data ApiModel(description "索引库实体") public class ItemDoc{…...

内存条的构造、原理及性能参数

内存条的构造、原理及性能参数 一、内存条的构造1.1 外观结构1.1.1 芯片:大脑1.1.2 PCB板:骨架1.1.3 金手指:接口1.1.4 电容电阻:稳压、稳流1.1.5 防呆缺口:防错 1.2 内部层次结构 二、内存条的工作原理2.1 数据的“搬…...

鸿蒙模块概念和应用启动相关类(HAP、HAR、HSP、AbilityStage、UIAbility、WindowStage、window)

目录 鸿蒙模块概念 HAP entry feature har shared 使用场景 HAP、HAR、HSP介绍 HAP、HAR、HSP开发 应用的启动 AbilityStage UIAbility WindowStage Window 拉起应用到显示到前台流程 鸿蒙模块概念 HAP hap包是手机安装的最小单元,1个app包含一个或…...

SQLark 百灵连接工具便捷功能之生成数据库测试数据

参考此文: SQLark百灵连接工具--数据生成...

ChirpIoT技术的优势以及局限性

ChirpIoT是一种由上海磐启微电子开发的国产无线射频通讯技术,ChirpIoT技术基于磐启多年对雷达等线性扩频信号的深入研究,并在此基础上对线性扩频信号的变化进行了改进,实现了远距离传输的一种无线通信技术。相关产品型号有E29-400T22D、E290-…...

Jetpack架构组件学习——使用Glance实现桌面小组件

基本使用 1.添加依赖 添加Glance依赖: // For AppWidgets supportimplementation "androidx.glance:glance-appwidget:1.1.0"// For interop APIs with Material 3implementation "androidx.glance:glance-material3:1.1.0"// For interop APIs with Mater…...

C++函数——fill

在C中,std::fill 是标准库提供的一个算法适用于几乎所有类型的容器,只要这些容器支持迭代器操作。具体来说,std::fill 的适用性取决于容器是否提供了满足其要求的迭代器类型,用于将指定范围内的所有元素设置为某个特定值。它是一个…...

二叉树(了解)c++

二叉树是一种特殊的树型结构,它的特点是: 每个结点至多只有2棵子树(即二叉树中不存在度大于2的结点) 并且二叉树的子树有左右之分,其次序不能任意颠倒,因此是一颗有序树 以A结点为例,左边的B是它的左孩子,右边的C是…...

备赛蓝桥杯之第十五届职业院校组省赛第三题:产品360度展示

提示:本篇文章仅仅是作者自己目前在备赛蓝桥杯中,自己学习与刷题的学习笔记,写的不好,欢迎大家批评与建议 由于个别题目代码量与题目量偏大,请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题&#xff0…...

业余无线电 对讲机常用频率使用

我自己的总结是,基本可以无忧使用: 144.035-145.800 146.000-148.000 430.000-431.900 432.240-435.000 438.000-439.000 50Mhz一般手台不支持,暂不记录。 以下为附录可以自行阅读,本文内容如有错误请留言指正。 特定波段…...

个性化的语言模型构建思路

将开源模型(如Llama3、Qwen、Falcon3 … 等)转变为个人专属的大语言模型,通常涉及知识库的构建、微调(fine-tuning)和模型定制等步骤。下面提供一个详细的技术解决方案,涵盖了如何利用现有的资料(如文档、PDF、Excel、PPT、图片、语音、视频等)将开源模型转换为个人专属…...

QT开发技术【QFileDialog卡顿问题】

一、直接用QFileDialog 在window 一般卡顿7秒 qDebug() << "begin:" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");QDateTime sTime QDateTime::currentDateTime();QString str QFileDialog::getOpenFileName(null…...

关于为什么java中nextInt()和nextLine()不能混用 | nextInt()和nextInt()之类的可以一起用

键盘录入的区别&#xff1a; 第一套体系&#xff1a;遇到空格、制表符、回车都结束&#xff0c;并且都不接收 nextInt()、nextDouble()、next() 遇到空格、制表符、回车就结束&#xff0c;只接收其之前的数据&#xff0c;空格以及空格之后的数据都在缓冲区内&#xff0c;如果…...

Android OpenGL(六) 纹理

纹理 纹理是一个2D图片&#xff08;甚至也有1D和3D的纹理&#xff09;&#xff0c; 它可以用来添加物体的细节&#xff1b;你可以想象纹理是一张绘有砖块的纸&#xff0c;无缝折叠贴合到你的3D的 房子上&#xff0c;这样你的房子看起来就像有砖墙外表了 纹理环绕方式 纹理坐…...

git和idea重新安装后提交异常

场景&#xff1a;我重装了系统&#xff0c;idea装了2024.3版本的&#xff0c;git也重新装了&#xff0c;但是项目中还是有.git文件夹的&#xff0c;下载了idea的码云插件后&#xff0c;提交报错如下&#xff1a; 异常&#xff1a;Error updating changes: detected dubious ow…...

leetcode刷题记录(八十一)——236. 二叉树的最近公共祖先

&#xff08;一&#xff09;问题描述 236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09;236. 二叉树的最近公共祖先 - 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科 [https://baike.baidu.com/item/%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B…...

STM32-CAN总线

1.CAN总线简介 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线 2.CAN总线特征 两根通信线&#xff08;CAN_H、CAN_L&#xff09;&#xff0c;线路少&#xff0c;无需共地差分信号通信&#xff08;相对的是单端信号&#xff09;&#…...

node.js 07.npm下包慢的问题与nrm的使用

一.npm下包慢 因为npm i 默认从npm官网服务器进行下包,但是npm官网服务器是海外服务器所以响应很慢. 于是我们通过npm下包的时候通常用淘宝镜像进行下包,下面是切换到淘宝镜像地址下包的操作. 二.nrm的使用 nrm是一个管理切换npm下包地址的工具,可以快速切换下包的地址. 安…...

ubuntu改变swap存储空间,遇到 fallocate 失败: 文本文件忙

ubuntu改变swap存储空间&#xff0c;遇到 fallocate 失败: 文本文件忙 sudo fallocate -l 16G /swapfile fallocate: fallocate 失败: 文本文件忙这种情况是swap空间正在使用&#xff0c;需要先关闭swap分区&#xff1a; sudo swapoff /swapfile sudo fallocate -l 16G /swap…...

20250122-正则表达式

1. 正则标记 表示一位字符&#xff1a;\\ 表示指定的一位字符&#xff1a;x 表示任意的一位字符&#xff1a;. 表示任意一位数字&#xff1a;\d 表示任意一位非数字&#xff1a;\D 表示任意一个字母&#xff1a;[a-zA-Z]&#xff08;大写或小写&#xff09; 表示任意一个…...

AutoCAD数据处理的.NET解决方案:ACadSharp全功能指南

AutoCAD数据处理的.NET解决方案&#xff1a;ACadSharp全功能指南 【免费下载链接】ACadSharp C# library to read/write cad files like dxf/dwg. 项目地址: https://gitcode.com/gh_mirrors/ac/ACadSharp 在工程数字化时代&#xff0c;如何高效处理AutoCAD文件数据已成…...

全电发票普及,智蜂AI智能代账助力合规与高效

票据管理时代已至智蜂AI代账破局增效人工智能自动化智蜂财税专注AI 人工智能代账服务&#xff0c;以智能系统高效处理票据、记账、报税&#xff0c;搭配专业会计师人工审核把关&#xff0c;为中小微企业提供安全、高效、合规的一站式财税解决方案&#xff0c;助力企业降本增效…...

2026年Magento独立站中国商家收单支付平台综合评估

2026年&#xff0c;全球收单市场持续分化。监管门槛抬升使支付牌照成为稀缺资源&#xff0c;资金周转效率从“加分项”变为“必选项”。对于使用Magento搭建独立站的中国商家&#xff0c;收单平台的选择已从单一的费率比较&#xff0c;升级为对合规深度、资金效率、本地化能力的…...

做对这三步,拥有一个聪明的智能问数与分析Agent

这两年&#xff0c;智能问数与分析&#xff0c;几乎已经成了 ToB Agent 里最容易出圈的“爆款场景”。原因不难理解。相比很多还停留在演示层、流程层的 AI 应用&#xff0c;智能问数更接近企业管理者最直接的需求&#xff1a;我有问题&#xff0c;系统能不能立刻给我答案&…...

暗黑破坏神2存档修改神器:从入门到精通的完整指南

暗黑破坏神2存档修改神器&#xff1a;从入门到精通的完整指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 如果你是暗黑破坏神2的忠实玩家&#xff0c;一定遇到过反复刷装备的枯燥、角色培养的漫长过程。d2s-editor作为一款强…...

2026年免费PDF转Word在线工具横评与选型指南

核心观点摘要 行业趋势显示&#xff0c;在线PDF转Word工具正向免安装、跨设备、隐私安全方向发展&#xff0c;用户对无广告与无使用次数限制的需求显著提升。选型关键维度包括转换质量、隐私机制、操作门槛、可用性与隐性成本&#xff0c;其中轻量化在线平台在易用性与速度上优…...

Linux网络诊断工具ping、traceroute等命令实战指南

在Linux系统的网络世界里&#xff0c;网络诊断工具就像是我们手中的“听诊器”&#xff0c;能够帮助我们精准地找出网络中存在的问题。今天&#xff0c;我们就来深入了解ping、traceroute等网络诊断命令的使用&#xff0c;通过实际操作和示例&#xff0c;让你轻松掌握使用这些工…...

Spring Data Elasticsearch查询方法大全:从简单查询到复杂聚合的10个实战案例

Spring Data Elasticsearch查询方法大全&#xff1a;从简单查询到复杂聚合的10个实战案例 【免费下载链接】spring-data-elasticsearch Provide support to increase developer productivity in Java when using Elasticsearch. Uses familiar Spring concepts such as a templ…...

Windows运行库终极解决方案:VisualCppRedist AIO完全指南

Windows运行库终极解决方案&#xff1a;VisualCppRedist AIO完全指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这种情况&#xff1a;满怀…...

机器人通信协议全览:30种核心技术解析

各类机器人常用通信协议抽象总结表&#xff08;按协议合并&#xff0c;带序号&#xff09;序号通信协议物理接口核心特点适用机器人场景1EtherCATRJ45微秒级延迟、纳秒级同步&#xff0c;实时性极强工业机器人、移动机器人&#xff08;AGV/AMR&#xff09;、四足机器人&#xf…...