微服务分布式搜索引擎 Elastic Search RestClient 操作文档

news2024/12/27 11:17:23

文章目录

  • ⛄引言
  • 一、初始化 Java RestClient
  • 二、RestClient 对文档的CRUD操作
    • ⛅新增文档
    • ⏰查询文档
    • ⚡修改文档
    • ⌚删除文档
  • 三、RestClient 批量文档导入
  • ⛵小结

⛄引言

本文参考黑马 分布式Elastic search
Elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容

一、初始化 Java RestClient

初始化RestHighLevelClient

为了与索引库操作分离,我们再次参加一个测试类,做两件事情:

  • 初始化RestHighLevelClient
  • 我们的酒店数据在数据库,需要利用IHotelService去查询,所以注入这个接口

文档测试类

import com.alibaba.fastjson.JSON;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.List;

/**
 * @author whc
 * @date 2023/2/28 15:01
 */
@SpringBootTest
public class HotelDocumentTest {

    private RestHighLevelClient restHighLevelClient;

    @Autowired
    private IHotelService hotelService;

    @BeforeEach
    void setUp() {
           this.restHighLevelClient = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("IP地址:9200")
        ));
    }

    @AfterEach
    void tearDown() throws IOException {
        this.restHighLevelClient.close();
    }
}

测试类初始化 RestClient完毕。

二、RestClient 对文档的CRUD操作

下面我们通过RestClient 对 文档进行 增删改查操作,以便更加深层次的理解。

⛅新增文档

需求: 将酒店数据从数据库查询出来,通过RestClient写入到ElasticSearch中。

实体类与索引库实体类的转换

数据库返回的结果是一个Hotel类型的对象,属性如下:

@Data
@TableName("tb_hotel")
public class Hotel {
    @TableId(type = IdType.INPUT)
    private Long id;
    private String name;
    private String address;
    private Integer price;
    private Integer score;
    private String brand;
    private String city;
    private String starName;
    private String business;
    private String longitude;
    private String latitude;
    private String pic;
}

那么问题来了,我们的ElasticSearch 索引库的结构与实体类不一致该怎么办?

例如:经纬度,索引库中是 通过location来实现的,通过 , 分割开 。 实体类中则是两个单独的属性。

因此,我们需要定义一个新的对象,将该属性进行合并从而达到我们想要的结果

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class HotelDoc {
    private Long id;
    private String name;
    private String address;
    private Integer price;
    private Integer score;
    private String brand;
    private String city;
    private String starName;
    private String business;
    private String location;
    private String pic;

    public HotelDoc(Hotel hotel) {
        this.id = hotel.getId();
        this.name = hotel.getName();
        this.address = hotel.getAddress();
        this.price = hotel.getPrice();
        this.score = hotel.getScore();
        this.brand = hotel.getBrand();
        this.city = hotel.getCity();
        this.starName = hotel.getStarName();
        this.business = hotel.getBusiness();
        this.location = hotel.getLatitude() + ", " + hotel.getLongitude();
        this.pic = hotel.getPic();
    }
}

语法说明

新增文档的DSL语句如下:

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

Java代码如下

在这里插入图片描述

可以看到与创建索引库类似,同样是三步走:

  • 1.创建Request对象
  • 2.准备请求参数,也就是DSL中的JSON文档
  • 3.发送请求

变化的地方在于,这里直接使用**client.xxx()的API,不再需要client.indices()**了。

完整代码测试新增文档

@Test
void testAddDocument() throws IOException {
    //获取酒店数据
    Hotel hotel = hotelService.getById(36934L);
	HotelDoc hotelDoc = new HotelDoc(hotel);
	//1.创建request对象
    IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());
    //2.准备参数
    request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);
    //3.发送请求
    restHighLevelClient.index(request, RequestOptions.DEFAULT);
}

执行即可。

⏰查询文档

查询的DSL语句如下:

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

大致分为2步

  • 准备Request对象
  • 发送请求

不过查询的目的是得到结果,解析为HotelDoc,因此难点是结果的解析。完整代码如下:

在这里插入图片描述

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

与之前类似,也是分为三步

  • 1.准备Request对象。这次是查询,所以是GetRequest
  • 2.发送请求,得到结果。因为是查询,这里调用client.get()方法
  • 3.解析结果,就是对JSON做反序列化

完整代码

@Test
void testGetDocument() throws IOException {
    //1.创建request对象
    GetRequest request = new GetRequest("hotel", "36934");
    //2.发送请求
    GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
    String sourceAsString = response.getSourceAsString();
    System.out.println(sourceAsString);
}

结果如下:

在这里插入图片描述

⚡修改文档

修改是分为两种方式:

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

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

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

这里我们主要介绍 增量修改

代码示例如下:

在这里插入图片描述

与之前类似,主要分为三步

  • 1.准备Request对象。这次是修改,所以是 UpdateRequest
  • 2.准备参数。也就是JSON文档,里面包含要修改的字段
  • 3.更新文档。这里调用client.update()方法

完整代码

@Test
void testUpdateDocument() throws IOException {
    //1.创建request对象
    UpdateRequest request = new UpdateRequest("hotel", "36934");
    //2.准备参数
    request.doc(
        "price", "456",
        "starName", "三钻"
    );
    //3.发送请求
    restHighLevelClient.update(request, RequestOptions.DEFAULT);
}

修改结果

执行完毕修改后,再次通过get请求查看修改结果

在这里插入图片描述

⌚删除文档

删除的DSL为是这样的:

DELETE /hotel/_doc/{id}

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

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

完整Java代码

@Test
void testDeleteDocument() throws IOException {
    //1.创建request对象
    DeleteRequest request = new DeleteRequest("hotel", "36934");
    //2.发送请求
    restHighLevelClient.delete(request, RequestOptions.DEFAULT);
}

查看删除结果

执行完毕后,调用get请求查看结果

在这里插入图片描述

三、RestClient 批量文档导入

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

步骤如下:

  • 利用 mybatis-plus 查询酒店数据
  • 将查询到的酒店数据(Hotel)转换为文档类型数据(HotelDoc)
  • 利用JavaRestClient中的BulkRequest批处理,实现批量新增文档

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

其中提供了一个add方法,用来添加其他请求

在这里插入图片描述

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

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

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

在这里插入图片描述

依旧是分为三步:

  • 1.创建Request对象。这里是BulkRequest
  • 2.准备参数。批处理的参数,就是其它Request对象,这里就是多个IndexRequest
  • 3.发起请求。这里是批处理,调用的方法为client.bulk()方法

导入酒店数据后,将代码改为for循环即可

完整Java代码

@Test
void testBulk() throws IOException {
    //获取酒店数据
    List<Hotel> hotels = hotelService.list();

    //1.创建bulk请求
    BulkRequest request = new BulkRequest();
    //2.添加批量处理的请求
    for (Hotel hotel : hotels) {
        HotelDoc hotelDoc = new HotelDoc(hotel);
        request.add(new IndexRequest("hotel").
                    id(hotel.getId().toString()).source(JSON.toJSONString(hotelDoc), XContentType.JSON));
    }

    //3.发送请求
    restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
}

查看执行结果

执行完毕后,执行 以下DSL语句批量查询

在这里插入图片描述

执行完毕,导入成功。

⛵小结

以上就是【Bug 终结者】对 微服务分布式搜索引擎 Elastic Search RestClient 操作文档 的简单介绍,ES搜索引擎无疑是最优秀的分布式搜索引擎,使用它,可大大提高项目的灵活、高效性! 技术改变世界!!!

如果这篇【文章】有帮助到你,希望可以给【Bug 终结者】点个赞👍,创作不易,如果有对【后端技术】、【前端领域】感兴趣的小可爱,也欢迎关注❤️❤️❤️ 【Bug 终结者】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💝💝💝!

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

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

相关文章

SpringBoot整合XXL-JOB

XXL-JOB&#xff1a; 官网文档地址&#xff1a;分布式任务调度平台XXL-JOB GitHub地址&#xff1a;https://github.com/xuxueli/xxl-job Gitee地址&#xff1a;https://gitee.com/xuxueli0323/xxl-job 拉取代码&#xff0c;首先执行一下doc/db下的sql文件 tables_xxl_job.sq…

JAVA识别电子发票问题汇总

之前写的java解析电子发票&#xff0c;上线后出现了一下线上的问题&#xff0c;无法解析发票&#xff0c;对问题做个规整&#xff0c;仅供参考&#xff01; 1. Pdfbox介绍 pdfbox是一款Apache的开源工具&#xff0c;可以进行对pdf进行操作&#xff0c;如题&#xff0c;转图片…

UE4C++学习篇(十九)-- 动画蒙太奇初级使用

用一个第三人称的射击案例来简单介绍一下动画蒙太奇的使用&#xff0c;动画蒙太奇的具体介绍这里就不多说了&#xff0c;不知道的小伙伴可以去搜一下了解。 这里介绍角色射击&#xff0c;射击的时候播放一个射击动画。 选中需要创建出动画蒙太奇的动画&#xff0c;点击创建&am…

物理服务器通过U盘安装CentOS 7操作系统

一、制作U盘启动盘 1、使用UltraISO工具打开需要安装的操作系统iso镜像文件&#xff08;我安装的是CentOS-7-x86_64-Minimal-2009.iso&#xff09;&#xff0c;如下图所示 镜像下载地址&#xff1a;centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 2、将该系统镜像…

nginx--官方模块

目录 1.概述 2.Nginx的客户端状态 1.使用 2.目录中选择一个随机主页 3.http内容替换 ​编辑 4.nginx请求限制 5.nginx访问控制 1.基于Ip的访问控制 1.1使用 1.2access_mod.conf 1.3只允许自己ip访问 1.4http_x_forwarded_for 1.5http_access_module局限性 2.基于…

【用python将文件夹下面的文件夹里面的文件全部提取出来,并且放到一个新的文件夹】

文件里面有多个文件&#xff0c;每个文件下面有很多jpg格式的照片&#xff0c;把所有照片提取出来并且放在一个新的文件夹下面。 可以使用Python的os和shutil库来完成这个任务。 比如说&#xff1a;我的faces95文件夹下面有95个文件&#xff0c;每个文件下面有十七到十八个照片…

深拷贝和浅拷贝

目录 一.Java的Cloneable和clone()方法 1.Object类中的clone() 2.实现Cloneable接口的类 3.通过clone()生成对象的特点 二.深拷贝和浅拷贝 1.浅拷贝 2.深拷贝 3.实现深拷贝的两种方法 1.一种是递归的进行拷贝 2.Json字符串的方式进行深拷贝 一.Java的Cloneable和clone…

No.037<软考>《(高项)备考大全》【第21章】项目组合管理

【第21章】项目组合管理1 考试相关2 项目组合管理2.1 项目组合管理、项目集管理、项目管理异同2.2 项目组合管理过程组3 练习题参考答案1 考试相关 选择1分必考 案例概率低&#xff0c;知识点看一遍即可 2 项目组合管理 1、项目组合是将项目、项目集&#xff0c;以及其他方面…

2023年MathorCup数学建模赛题浅析

MathorCup俗称妈杯&#xff0c;是除了美赛国赛外参赛人数首屈一指的比赛&#xff0c;而我们的妈杯今天也如期开赛。今年的妈杯难度&#xff0c;至少在我看来应该是2023年截至目前来讲最难的一场比赛。问题的设置、背景的选取等各个方面都吐露着我要难死你们的想法。难度是恒定的…

Servlet、SpringMVC、SpringBoot整合Thymeleaf汇总

介绍 模板引擎&#xff0c;与JSP、JSTL类似。 好处是&#xff1a;直接写在HTML文件中&#xff0c;服务器可以解析&#xff0c;浏览器也可以解析&#xff0c;实现了动静分离&#xff0c;并未破坏html结构&#xff0c;即使无网络、不通过后端渲染也能在浏览器成功打开&#xff…

kettle——数据清洗(数据表-->文本文件)

实验步骤&#xff1a; 1.数据表&#xff08;图片加分析&#xff0c;创建表的过程和对应的字段及记录&#xff09; ①选择数据库 ②创建表结构 ③插入数据 2.kettle连接模块&#xff08;图片加分析,每个模块实现的功能&#xff09; ①新建“转换”文件,”文件”——>“新建…

JAVA开发运维(Jenkins中踩的坑)

最近尝试通过Jenkins来自动化部署项目&#xff0c;没想到还踩了很多坑。Jenkins部署的基本原理&#xff1a; 通过Jenkins服务器拉取gitlab上的代码进行打包&#xff0c;推送到目标服务器上&#xff0c;并运行启动脚本。 那么Jenkins就要解决三个问题。 1.连接上目标服务器 …

电子行业应如何实施数字工厂管理系统

随着信息技术的快速发展&#xff0c;电子制造企业也正在逐步做好数字化转型&#xff0c;而数字工厂管理系统便是数字化管理中的一个重要系统。数字工厂系统可以帮助电子企业实现生产过程的自动化、智能化和可视化&#xff0c;提高生产效率&#xff0c;降低生产成本&#xff0c;…

2023香港国际创科展开幕,欧科云链受邀参展

4月12日&#xff0c;由香港特区政府、香港贸易发展局主办的首届香港国际创科展&#xff08;InnoEX&#xff09;在香港会展中心开幕&#xff0c;欧科云链&#xff08;01499.HK)作为全球领先的Web3科技企业受邀参展。香港国际创科展现场图 此次创科展上&#xff0c;欧科云链向公众…

【RocketMQ】负载均衡源码分析

RocketMQ在集群模式下&#xff0c;同一个消费组内&#xff0c;一个消息队列同一时间只能分配给组内的某一个消费者&#xff0c;也就是一条消息只能被组内的一个消费者进行消费&#xff0c;为了合理的对消息队列进行分配&#xff0c;于是就有了负载均衡。 接下来以集群模式下的消…

智优ERP的升级版智优E3_ERP,可以自定义列,和自定义打印公司logo

新版的智优E3_ERP系统&#xff0c;新增了许多供自定义的列。 系统能够解决的企业管理问题&#xff1a; 一、日常的出入库管理、收付款管理、往来对账、移动加权平均成本核算、以及相关数据的查询分析&#xff1b; 二、订单的跟单管理&#xff08;包括销售跟单、采购跟单、生产…

ElasticSearch常用查询操作

ES查询 一般我们使用ES最多的就是查询&#xff0c;今天就讲一下ES的查询。这里我是建了一个person的索引。 "person" : {"aliases" : { },"mappings" : {"properties" : {"address" : {"type" : "text"…

[LeetCode周赛复盘] 第 102 场双周赛20230415

[LeetCode周赛复盘] 第 102 场双周赛20230415 一、本周周赛总结二、 6333. 查询网格图中每一列的宽度1. 题目描述2. 思路分析3. 代码实现三、6334. 一个数组所有前缀的分数1. 题目描述2. 思路分析3. 代码实现四、6335. 二叉树的堂兄弟节点 II1. 题目描述2. 思路分析3. 代码实现…

English Learning - L2 第 15 次小组纠音 助动词弱读和重音节奏 2023.4.15 周六

English Learning - L2 第 15 次小组纠音 助动词弱读和重音节奏 2023.4.15 周六共性问题have has /hv/ /hz/ 弱读成 /həv/ /həz/fine left /faɪn/ /left/late changed train /leɪt/ /ʧeɪnʤd/ /treɪn/ 中的 eɪmoment problem time /ˈməʊmənt/ /ˈprɒbləm/ /taɪm…

4.10~4.11学习总结

ER图的学习&#xff1a; 学习了ER图相关知识&#xff0c;并绘制了项目大概的ER图 详细笔记博客&#xff1a;http://t.csdn.cn/YOJxq MySQL的学习&#xff1a; 函数 学习了字符串函数&#xff0c;数值函数&#xff0c;日期函数&#xff0c;流程函数。 约束 作用于表中字段的规则…