【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度展示
提示:本篇文章仅仅是作者自己目前在备赛蓝桥杯中,自己学习与刷题的学习笔记,写的不好,欢迎大家批评与建议 由于个别题目代码量与题目量偏大,请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题࿰…...
业余无线电 对讲机常用频率使用
我自己的总结是,基本可以无忧使用: 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()之类的可以一起用
键盘录入的区别: 第一套体系:遇到空格、制表符、回车都结束,并且都不接收 nextInt()、nextDouble()、next() 遇到空格、制表符、回车就结束,只接收其之前的数据,空格以及空格之后的数据都在缓冲区内,如果…...

Android OpenGL(六) 纹理
纹理 纹理是一个2D图片(甚至也有1D和3D的纹理), 它可以用来添加物体的细节;你可以想象纹理是一张绘有砖块的纸,无缝折叠贴合到你的3D的 房子上,这样你的房子看起来就像有砖墙外表了 纹理环绕方式 纹理坐…...
git和idea重新安装后提交异常
场景:我重装了系统,idea装了2024.3版本的,git也重新装了,但是项目中还是有.git文件夹的,下载了idea的码云插件后,提交报错如下: 异常:Error updating changes: detected dubious ow…...

leetcode刷题记录(八十一)——236. 二叉树的最近公共祖先
(一)问题描述 236. 二叉树的最近公共祖先 - 力扣(LeetCode)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总线特征 两根通信线(CAN_H、CAN_L),线路少,无需共地差分信号通信(相对的是单端信号)&#…...

node.js 07.npm下包慢的问题与nrm的使用
一.npm下包慢 因为npm i 默认从npm官网服务器进行下包,但是npm官网服务器是海外服务器所以响应很慢. 于是我们通过npm下包的时候通常用淘宝镜像进行下包,下面是切换到淘宝镜像地址下包的操作. 二.nrm的使用 nrm是一个管理切换npm下包地址的工具,可以快速切换下包的地址. 安…...
ubuntu改变swap存储空间,遇到 fallocate 失败: 文本文件忙
ubuntu改变swap存储空间,遇到 fallocate 失败: 文本文件忙 sudo fallocate -l 16G /swapfile fallocate: fallocate 失败: 文本文件忙这种情况是swap空间正在使用,需要先关闭swap分区: sudo swapoff /swapfile sudo fallocate -l 16G /swap…...

20250122-正则表达式
1. 正则标记 表示一位字符:\\ 表示指定的一位字符:x 表示任意的一位字符:. 表示任意一位数字:\d 表示任意一位非数字:\D 表示任意一个字母:[a-zA-Z](大写或小写) 表示任意一个…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...