elasticsearch的RestAPI之操作文档

news/2025/1/15 13:19:18/文章来源:https://www.cnblogs.com/WarBlog/p/18672582

RestClient操作文档

新增文档

将DB表中的数据同步到elasticsearch

1)查询数据库

1.1)数据库查询后的结果是一个Hotel类型的对象

 1 @Data
 2 @TableName("tb_hotel")
 3 public class Hotel {
 4     @TableId(type = IdType.INPUT)
 5     private Long id;
 6     private String name;
 7     private String address;
 8     private Integer price;
 9     private Integer score;
10     private String brand;
11     private String city;
12     private String starName;
13     private String business;
14     private String longitude;
15     private String latitude;
16     private String pic;
17 }

2)将查询结果的数据做成DSL语句

2.1)新增文档的DSL语句如下:

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

2.2)创建一个与索引库结构吻合

查询结果的结构与索引库结构存在差异:

  • longitude和latitude需要合并为location
 1 @Data
 2 @NoArgsConstructor
 3 public class HotelDoc {
 4     private Long id;
 5     private String name;
 6     private String address;
 7     private Integer price;
 8     private Integer score;
 9     private String brand;
10     private String city;
11     private String starName;
12     private String business;
13     private String location;
14     private String pic;
15 
16     public HotelDoc(Hotel hotel) {
17         this.id = hotel.getId();
18         this.name = hotel.getName();
19         this.address = hotel.getAddress();
20         this.price = hotel.getPrice();
21         this.score = hotel.getScore();
22         this.brand = hotel.getBrand();
23         this.city = hotel.getCity();
24         this.starName = hotel.getStarName();
25         this.business = hotel.getBusiness();
26         this.location = hotel.getLatitude() + ", " + hotel.getLongitude();
27         this.pic = hotel.getPic();
28     }
29 }

3)将DB数据同步到elasticsearch

 1 @Test
 2 void testAddDocument() throws IOException {
 3     // 1.根据id查询酒店数据
 4     Hotel hotel = hotelService.getById(61083L);
 5     // 2.转换为文档类型
 6     HotelDoc hotelDoc = new HotelDoc(hotel);
 7     // 3.将HotelDoc转json
 8     String json = JSON.toJSONString(hotelDoc);
 9 
10     // 1.准备Request对象 POST /hotel/_doc/{id}
11     IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
12     // 2.准备Json文档 {"name": "Jack",    "age": 21}
13     request.source(json, XContentType.JSON);
14     // 3.发送请求
15     client.index(request, RequestOptions.DEFAULT);
16 }

新增文档步骤

  • 创建请求对象IndexRequest
  • 准备请求参数,也就是DSL中的JSON文档
  • 发送请求,通过索引库的操作对象的index方法发送请求

查询文档

1)查询的DSL语句如下:

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

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

2)查询文档

@Test
void testGetDocumentById() throws IOException {// 1.准备RequestGetRequest request = new GetRequest("hotel", "61082");// 2.发送请求,得到响应GetResponse response = client.get(request, RequestOptions.DEFAULT);// 3.解析响应结果String json = response.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);System.out.println(hotelDoc);
}

查询文档步骤

  • 创建请求对象GetRequest
  • 发送请求,通过索引库的操作对象的get方法发送请求,得到响应(GetResponse response)对象
  • 响应是一个JSON,其中文档放在一个_source属性中,通过通过响应对象的getSourceAsString方法获取_source,反序列化为Java对象即可

删除文档

1)DSL:

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

2)删除文档

1 @Test
2 void testDeleteDocument() throws IOException {
3     // 1.准备Request
4     DeleteRequest request = new DeleteRequest("hotel", "61083");
5     // 2.发送请求
6     client.delete(request, RequestOptions.DEFAULT);
7 }

删除文档步骤

  • 创建请求对象DeleteRequest
  • 发送请求,通过索引库的操作对象的delete方法发送请求

修改文档

修改文档两种方式:

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

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

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

修改文档

 1 @Test
 2 void testUpdateDocument() throws IOException {
 3     // 1.准备Request
 4     UpdateRequest request = new UpdateRequest("hotel", "61083");
 5     // 2.准备请求参数
 6     request.doc(
 7         "price", "952",
 8         "starName", "四钻"
 9     );
10     // 3.发送请求
11     client.update(request, RequestOptions.DEFAULT);
12 }

修改文档步骤

  • 创建请求对象UpdateRequest
  • 准备参数。也就是JSON文档,包含要修改的字段
  • 发送请求,通过索引库的操作对象的update方法发送请求

批量导入文档

案例需求:利用BulkRequest批量将数据库数据导入到索引库中

步骤如下:

  • 利用mybatis-plus查询酒店数据

  • 将查询到的酒店数据(Hotel)转换为文档类型数据(HotelDoc)

  • 利用JavaRestClient中的BulkRequest批处理,实现批量新增文档

语法说明

批量处理BulkRequest,其本质就是将多个普通的CRUD请求组合在一起发送。

 

可以看到,能添加的请求包括:

  • IndexRequest,也就是新增
  • UpdateRequest,也就是修改
  • DeleteRequest,也就是删除

因此Bulk中添加了多个IndexRequest,就是批量新增功能了。示例:

 1 @Test
 2     void testBulkRequest() throws IOException {
 3         // 查询所有的酒店数据
 4         List<Hotel> list = hotelService.list();
 5 
 6         // 1.准备Request
 7         BulkRequest request = new BulkRequest();
 8         // 2.准备参数
 9         for (Hotel hotel : list) {
10             // 2.1.转为HotelDoc
11             HotelDoc hotelDoc = new HotelDoc(hotel);
12             // 2.2.转json
13             String json = JSON.toJSONString(hotelDoc);
14             // 2.3.添加请求
15             request.add(new IndexRequest("hotel").id(hotel.getId().toString()).source(json, XContentType.JSON));
16         }
17 
18         // 3.发送请求
19         client.bulk(request, RequestOptions.DEFAULT);
20     }

完整代码

@SpringBootTest
class HotelDocumentTest {private RestHighLevelClient client;@Autowiredprivate IHotelService hotelService;@Testvoid testAddDocument() throws IOException {// 1.查询数据库hotel数据Hotel hotel = hotelService.getById(61083L);// 2.转换为HotelDocHotelDoc hotelDoc = new HotelDoc(hotel);// 3.转JSONString json = JSON.toJSONString(hotelDoc);// 1.准备RequestIndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());// 2.准备请求参数DSL,其实就是文档的JSON字符串
        request.source(json, XContentType.JSON);// 3.发送请求
        client.index(request, RequestOptions.DEFAULT);}@Testvoid testGetDocumentById() throws IOException {// 1.准备Request      // GET /hotel/_doc/{id}GetRequest request = new GetRequest("hotel", "61083");// 2.发送请求GetResponse response = client.get(request, RequestOptions.DEFAULT);// 3.解析响应结果String json = response.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);System.out.println("hotelDoc = " + hotelDoc);}@Testvoid testDeleteDocumentById() throws IOException {// 1.准备Request      // DELETE /hotel/_doc/{id}DeleteRequest request = new DeleteRequest("hotel", "61083");// 2.发送请求
        client.delete(request, RequestOptions.DEFAULT);}@Testvoid testUpdateById() throws IOException {// 1.准备RequestUpdateRequest request = new UpdateRequest("hotel", "61083");// 2.准备参数
        request.doc("price", "870");// 3.发送请求
        client.update(request, RequestOptions.DEFAULT);}@Testvoid testBulkRequest() throws IOException {// 查询所有的酒店数据List<Hotel> list = hotelService.list();// 1.准备RequestBulkRequest request = new BulkRequest();// 2.准备参数for (Hotel hotel : list) {// 2.1.转为HotelDocHotelDoc hotelDoc = new HotelDoc(hotel);// 2.2.转jsonString json = JSON.toJSONString(hotelDoc);// 2.3.添加请求request.add(new IndexRequest("hotel").id(hotel.getId().toString()).source(json, XContentType.JSON));}// 3.发送请求
        client.bulk(request, RequestOptions.DEFAULT);}@BeforeEachvoid setUp() {client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.232.128:9200")));}@AfterEachvoid tearDown() throws IOException {client.close();}
}
View Code

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VPX303】基于 3U VPX 总线架构的双银河飞腾 FT-M6678 DSP 信号处理平台(100%全国产化)

​产品概述 VPX303 是一款基于 3U VPX 总线架构的高性能信号处理板,板载 2 片国防科大银河飞腾 FT-M6678 多核浮点运算 DSP,可以实现各种实时性要求较高的信号处理算法。板卡每个 DSP 均支持 5 片 DDR3 SDRAM 实现数据缓存,两片DSP 之间通过 X4 SRIO 进行互联。每个 DSP 均引…

第七章 中断

本文是对《操作系统真象还原》第七章学习的笔记,欢迎大家一起交流。第七章 中断 本文是对《操作系统真象还原》第七章学习的笔记,欢迎大家一起交流。 a 启用中断 本节的主要任务是打开中断,并且使用时钟中断测试 知识部分 中断分类 中断可以分为外部中断和内部中断,这已经是…

PHP语法进阶

PHP语法进阶 数组 数组能够在单个变量中存储多个值,并且可以根据 键 访问其中的 值PHP有两种数组:数值数组、关联数组。 数值和关联两个词都是针对数组的键而言的。 先介绍下数值数组,数值数组是指数组的键是整数的数组,并且键的整数顺序是从0开始,依次类推。 数值数组 $m…

Agentic RAG 系统的崛起

探秘智能检索新境界:Agentic RAG 系统的崛起 📖阅读时长:10分钟 🕙发布时间:202探秘智能检索新境界:Agentic RAG 系统的崛起 📖阅读时长:10分钟 🕙发布时间:2025-01-15近日热文:全网最全的神经网络数学原理(代码和公式)直观解释 欢迎关注知乎和公众号的专栏内…

5、提升Java的并发性

CompletableFuture及反应式编程背后的概念 :::info ❏线程、Future以及推动Java支持更丰富的并发API的进化动力 ❏ 异步API ❏ 从“线框与管道”的角度看并发计算 ❏ 使用CompletableFuture结合器动态地连接线框❏ 构成Java 9反应式编程Flow API基础的“发布-订阅”协议❏ 反应…

goal vs objective vs target

goal 680 objective 2421 target 1284GOAL vs OBJECTIVE left 4WORD 1: GOAL 过滤200WORD W1 W2SCORED 1423 1 He has scored a further five goals in the Spanish Supercup and the Champions League.他在西班牙超级杯和冠军联赛中又打进了五个进球。 scored Barcas fourth…

大模型备案流程-简易易懂

大模型备案除了资料撰写难度高外,难点还在于各省没有统一标准。备案流程、资料要求、考察重点都会有些许差异。不过,各省的大体申报流程都如下文所示(各省主要差异点我会标出,具体内容可以一起沟通交流): 一、备案申请 报请申请者所在省份/直辖市/自治区网信:向企业注册地…

KingbaseES RAC集群案例之---jmeter压测

KingbaseES RAC、jmeter案例说明: 通过jmeter压测,测试KingbaseES RAC集群负载均衡功能。 数据库版本: test=# select version();version ---------------------KingbaseES V008R006 (1 row)测试架构:一、jmeter版本 1、系统jiava版本 [root@node203 ~]# java -version ope…

{LOJ #6041. 「雅礼集训 2017 Day7」事情的相似度 题解

\(\text{LOJ \#6041. 「雅礼集训 2017 Day7」事情的相似度 题解}\) 解法一 由 parent 树的性质得到,前缀 \(s_i,s_j\) 的最长公共后缀实质上就是 \(i,j\) 在 SAM 中的 \(\operatorname{LCA}\) 在 SAM 中的 \(\operatorname{len}\)。让我们考虑如何处理 \((l,r)\) 区间内的询问…

解决Hyper-V保留端口导致各种端口占用报错的问题

0.有时候在本地启用一个服务比如MySQL服务,或者在启用IDEA的调试的时候,或者在本地启用一个监听端口的时候可能会出现监听失败的情况,经过查找之后会发现并没有应用占用相应的端口。 1.经过查找发现其实是在启用了Hyper-V之后系统会保留一些端口,这些端口如果包含了你应用要…

D. Madoka and The Corruption Scheme -- (贪心,组合数学,构造)

题目链接:Problem - D - Codeforces 题目大意: 一共n轮比赛,有\(2^n\)个参赛者,第\(i\)轮有\(2^{n - i}\) 场比赛,Madoka能安排第一局的比赛,她想让最后的赢家编号更小,主办方最多有k次操作,能修改任意每一场比赛的获胜情况,可以让最终赢家编号更 大,求Madoka在主办方…