探索Elasticsearch:文档的CRUD

embedded/2025/3/4 13:51:55/

在企业环境中,Elasticsearch对文档操作的支持不仅是实现高效搜索的关键,更是数据驱动决策的重要支柱。它通过强大的索引机制和灵活的查询语言,使企业能够实时处理和分析海量文档数据,迅速获取有价值的洞察,从而加速创新、优化运营并提升客户体验。 Elasticsearch让文档管理从简单的存储检索升级为智能信息发掘,成为现代企业不可或缺的数据处理引擎。


目录

文档的CRUD

基于Kibana控制台操作

新增文档

查询文档

修改文档

全量修改

局部修改

删除文档

基于Java REST Client 实现

准备依赖

准备实体类

初始化RestHighLevelClient

查询文档

删除文档

批处理操作文档


elasticsearch是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中。

上文中我们有了索引库,接下来就可以向索引库中添加数据了。

Elasticsearch中的数据其实就是JSON风格的文档。操作文档自然保护等几种常见操作。

文档的CRUD

基于Kibana控制台操作

新增文档

# 新增文档
POST /user/_doc/1
{"info": "我们都会找到好工作","email": "zy@itcast.cn","name": {"firstName": "云","lastName": "赵"}
}

实现效果如下:


查询文档

# 查询文档
GET /user/_doc/1

实现效果如下:


修改文档

全量修改
# 全量修改
PUT /user/_doc/1
{"info": "我们都会找到幸福","email": "ZZZ@itcast.cn","name": {"firstName": "云","lastName": "赵"}
}

实现效果如下:

局部修改
# 局部修改Java
POST /user/_update/1
{"doc": {"email": "ZhaoYun@itcast.cn"}
}

实现效果如下:


删除文档

# 删除文档
DELETE /user/_doc/1

实现效果如下:


基于Java REST Client 实现

准备依赖

上文导入了es的依赖

        <!-- mysql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.31</version></dependency><!-- mybatisPlus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency><!--hutool工具包--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.14</version></dependency>

准备一个数据库表(毕竟是测试,就建了一张表)

准备实体类

准备普通实体类Item和引库结构对应的实体类ItemDoc

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)public class Item implements Serializable {private static final long serialVersionUID = 1L;/*** 商品id*/private Long id;/*** SKU名称*/private String name;/*** 价格(分)*/private Integer price;/*** 库存数量*/private Integer stock;/*** 商品图片*/private String image;/*** 类目名称*/private String category;/*** 品牌名称*/private String brand;/*** 规格*/private String spec;/*** 销量*/private Integer sold;/*** 评论数*/private Integer commentCount;/*** 是否是推广广告,true/false*/@TableField("isAD")private Boolean isAD;/*** 商品状态 1-正常,2-下架,3-删除*/private Integer status;/*** 创建时间*/private LocalDateTime createTime;/*** 更新时间*/private LocalDateTime updateTime;/*** 创建人*/private Long creater;/*** 修改人*/private Long updater;}
@Data
public class ItemDoc {private String id;private String name;private Integer price;private String image;private String category;private String brand;private Integer sold;private Integer commentCount;@TableField("isAD")private Boolean isAD;private LocalDateTime updateTime;}

准备一个ItemMapper

@Mapper
public interface ItemMapper extends BaseMapper<Item> {}

创建一个测试类ElasticDocTest

初始化RestHighLevelClient

 private RestHighLevelClient client;@Autowiredprivate ItemMapper itemMapper;/*** 初始化ES客户端*/@BeforeEachvoid setUp() {client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://自己的虚拟机地址:9200")));}/*** 关闭ES客户端* @throws IOException*/@AfterEachvoid tearDown() throws IOException {if (client != null) {client.close();}}/*** 测试连接*/@Testvoid testConnection() {System.out.println("client = " + client);}

测试连接

连接ES客户端成功


新增文档

    /*** 新增文档* @throws IOException*/@Testvoid testIndexDoc() throws IOException {// 1.根据id查询商品数据Item item = itemMapper.selectById(11);// 2.转换为文档类型ItemDoc itemDoc = BeanUtil.copyProperties(item, ItemDoc.class); // 修改类名// 3.将ItemDTO转jsonString doc = JSONUtil.toJsonStr(itemDoc);// 1.准备Request对象IndexRequest request = new IndexRequest("items").id(itemDoc.getId());// 2.准备Json文档request.source(doc, XContentType.JSON);// 3.发送请求client.index(request, RequestOptions.DEFAULT);}

查询文档

 /*** 根据id查询文档* @throws IOException*/@Testvoid testGetDocumentById() throws IOException {// 1.准备Request对象GetRequest request = new GetRequest("items").id("11");// 2.发送请求GetResponse response = client.get(request, RequestOptions.DEFAULT);// 3.获取响应结果中的sourceString json = response.getSourceAsString();ItemDoc itemDoc = JSONUtil.toBean(json, ItemDoc.class);System.out.println("itemDoc= " + itemDoc);}

实现效果如下:

验证:新增文档和查询文档的成功了

修改文档

    /*** 根据id更新文档* @throws IOException*/@Testvoid testUpdateDocument() throws IOException {// 1.准备RequestUpdateRequest request = new UpdateRequest("items", "11");// 2.准备请求参数request.doc("price", 66666,"commentCount", 1);// 3.发送请求client.update(request, RequestOptions.DEFAULT);}

实现效果如下:(重新查询后与上图对比)


删除文档

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

实现效果如下:(重新查询后与上图对比)


批处理操作文档

在之前的测试中,我们都是操作单个文档。而数据库中的商品数据实际会达到数十万条,某些项目中可能达到数百万条。

我们如果要将这些数据导入索引库,肯定不能逐条导入,而是采用批处理方案。

演示批量导入

@Testvoid testLoadItemDoc() throws IOException {// 分页查询商品数据int pageNo = 1;int size = 100;while (true) {// 查询当前页数据Page<Item> page = itemService.lambdaQuery().eq(Item::getStatus, 1).page(new Page<>(pageNo, size));// 获取当前页记录List<Item> items = page.getRecords();// 如果当前页没有数据,退出循环if (CollUtil.isEmpty(items)) {log.info("所有数据已加载完成");break;}log.info("加载第{}页数据,共{}条", pageNo, items.size());// 创建批量请求BulkRequest request = new BulkRequest("items");// 遍历当前页数据,添加到批量请求中for (Item item : items) {ItemDoc itemDoc = BeanUtil.copyProperties(item, ItemDoc.class);request.add(new IndexRequest().id(itemDoc.getId()).source(JSONUtil.toJsonStr(itemDoc), XContentType.JSON));}// 发送批量请求client.bulk(request, RequestOptions.DEFAULT);// 如果没有下一页数据,退出循环if (!page.hasNext()) {log.info("没有更多数据了");break;}// 翻页pageNo++;}}

实现效果如下:(主要我就准备了15条)


http://www.ppmy.cn/embedded/169926.html

相关文章

DataWorks (数据工厂)介绍

介绍 DataWorks 是阿里云推出的一体化大数据开发与治理平台&#xff0c;曾用名"数据工厂""大数据开发套件" 最新版本是3.0 它是一套基于MaxCompute&#xff08;原ODPS&#xff09;的DW(数据仓库)解决方案&#xff0c;它集成了阿里多年的DW实施经验&…

@update 的常见用法 Vue.js

在 Vue.js 中&#xff0c;update 是一个事件监听器&#xff0c;通常用于监听自定义组件或某些 Vue 原生组件&#xff08;如 <input> 或自定义组件&#xff09;的更新事件。它并不是 Vue 的核心 API&#xff0c;而是一种约定俗成的命名方式&#xff0c;用于处理组件内部状…

Vue3 Transition组件深度解析:结合Element Plus实践指南

引言 在Vue3的动画生态中&#xff0c;Transition组件是构建流畅交互体验的核心工具。本文将深入探讨其工作原理&#xff0c;并配合Element Plus组件库的实际案例&#xff0c;展示如何实现企业级应用的优雅过渡效果。 一、Transition组件核心机制 1.1 过渡类名生命周期 Vue3为…

【江科协-STM32】6. TIM编码器接口

1. 编码器接口简介 编码器接口(Encoder Interface)&#xff0c;可接收增量&#xff08;正交&#xff09;编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;自动控制CNT自增或自减&#xff0c;从而指示编码器的位置、旋转方向和旋转速度。 每个高级定时器…

美食推荐系统的微信小程序+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

【量化科普】Alpha,阿尔法

【量化科普】Alpha&#xff0c;阿尔法 &#x1f680;量化软件开通 &#x1f680;量化实战教程 在量化投资领域&#xff0c;Alpha&#xff08;阿尔法&#xff09;是一个核心概念&#xff0c;它代表了投资策略或投资组合相对于市场基准的超额回报。简单来说&#xff0c;如果一…

MambaMorph:基于 Mamba 的医学 MR-CT 可变形配准框架

摘要​ 跨模态&#xff08;如MR-CT、T1-T2&#xff09;体素级空间对应在医学图像分析中至关重要。然而&#xff0c;现有配准方法在精度和临床适用性方面仍存在不足。本文提出MambaMorph&#xff0c;一种新型多模态变形配准框架&#xff0c;包含基于Mamba的注册模块和细粒度特征…

完全背包变体-排列和组合的循环顺序问题

排列&#xff0c;区分顺序&#xff1a;内层循环物品{1,2}&#xff0c;可以让3-2->1-1和3-1->2-2都计算一遍。 组合不区分顺序&#xff1a;外层循环物品{1,2}&#xff0c;只会按照物品顺序填充 总结&#xff1a;排列问题中&#xff0c;每个容量的状态更新时&#xff0c;允…