ES的RestClient相关操作

news2024/11/25 5:17:44

ES的RestClient相关操作

Elasticsearch使用Java操作。

本文仅介绍CURD索引库和文档!!!

Elasticsearch基础:https://blog.csdn.net/weixin_46533577/article/details/137207222

Elasticsearch Clients官网:https://www.elastic.co/guide/en/elasticsearch/client/index.html

文档相关:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/getting-started-java.html

Java环境

规定ES版本。

<properties>
    <java.version>1.8</java.version>
    <!-- elasticsearch版本控制全局 -->
    <elasticsearch.version>7.12.1</elasticsearch.version>
</properties>

ES的版本为7.12.1。

<!--FastJson-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.47</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
</dependency>
<!-- elasticsearch -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

初始化RestClient

在连接开始前初始化连接对象,IP地址。

在后面关闭资源。

RestClient.builder中可以添加多个连接,方便集群环境。

import cn.itcast.hotel.constants.HotelConstants;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
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 java.io.IOException;

public class HotelIndexTest {
    private RestHighLevelClient client;

    @BeforeEach
    void setup() throws Exception {
        this.client = new RestHighLevelClient(RestClient.builder((
                        HttpHost.create("http://192.168.1.4:9200"))
                // 集群缓环境下可以配置多个
                // HttpHost.create("http://192.168.1.7:9200")
        ));
    }

    @AfterEach
    void teardown() throws Exception {
        this.client.close();
    }
}

初始化输出

// 初始化输出
@Test
void testInit() {
    System.out.println(client);
}

索引库操作

查询索引库

控制台中

控制台中添加索引库通过以下方式进行,那么在Java中也需要模拟这种请求。

需要注意的是,索引库不允许修改,只能在索引库中添加新的字段,但是不能修改

# 查询索引库
GET /bunny
Java中演示

ES遵循restfull原则,所以写几个之后大致也能猜出后面怎么写了。

// 查询索引库
@Test
void getHotelIndex() throws IOException {
    // 1. 创建Request对象
    GetIndexRequest request = new GetIndexRequest("hotel");
    // 2. 查询索引库
    boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
    // 输出是否删除
    System.out.println(exists);
}

删除索引库

控制台中
# 删除索引库
DELETE /bunny
Java中演示
// 删除索引库
@Test
void deleteHotelIndex() throws IOException {
    // 1. 创建Request对象
    DeleteIndexRequest request = new DeleteIndexRequest("hotel");
    // 2. 删除索引库
    client.indices().delete(request, RequestOptions.DEFAULT);
}

添加索引库

控制台中
# 创建索引库
PUT /bunny
{
  "mappings": {
    "properties": {
      "info": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "email": {
        "type": "keyword",
        "index": false
      },
      "name":{
        "type": "object",
        "properties": {
          "firstName":{
            "type":"keyword"
          },
          "lastName":{
            "type":"keyword"
          }
        }
      }
    }
  }
}
Java中演示

为了简单测试,将JSON直接复制了。存到变量中。

// 添加索引库
@Test
void createHotelIndex() throws IOException {
    // 1. 创建Request对象
    CreateIndexRequest request = new CreateIndexRequest("hotel");
    // 2.准备请求参数,DSL语句
    request.source(HotelConstants.HOTEL_JSON, XContentType.JSON);
    // 3. 发送请求
    client.indices().create(request, RequestOptions.DEFAULT);
}

在这里插入图片描述

文档操作

基础结构和上面一样。

import cn.itcast.hotel.constants.HotelConstants;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
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 java.io.IOException;

public class HotelIndexTest {
    private RestHighLevelClient client;

    @BeforeEach
    void setup() throws Exception {
        this.client = new RestHighLevelClient(RestClient.builder((
                        HttpHost.create("http://192.168.1.4:9200"))
                // 集群缓环境下可以配置多个
                // HttpHost.create("http://192.168.1.7:9200")
        ));
    }

    @AfterEach
    void teardown() throws Exception {
        this.client.close();
    }
}

文档添加

控制台中

修改也是这个请求。

# 插入文档会导致版本增加
POST /bunny/_doc/1
{
  "info":"插入文档",
  "email":"1@gamil.com",
  "name":{
    "firstName":"舒",
    "lastName":"纹"
  }
}
Java中演示
// 插入文档,记得转换成JSON对象
@Test
void testAddDocument() throws Exception {
    // 根据id查询酒店数据
    Hotel hotel = hotelService.getById(61083L);
    // 转换为文档类型,其中有经纬度转换
    HotelDoc hotelDoc = new HotelDoc(hotel);

    // 1. 准备Request对象
    IndexRequest request = new IndexRequest("hotel").id(String.valueOf(hotelDoc.getId()));
    // 2. 准备JSON文档
    request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);
    // 3. 发送请求
    client.index(request, RequestOptions.DEFAULT);
}

文档查询

控制台中

/bunny/_doc/:参数为文档名称/文档id

# 查询文档
GET /bunny/_doc/1
Java中演示

GetRequest中传入,文档名称和文档id。

// 查询文档操作
@Test
void testGetDocuments() throws Exception {
    // 准备Request
    GetRequest request = new GetRequest("hotel", "61083");
    // 发送请求
    GetResponse response = client.get(request, RequestOptions.DEFAULT);
    // 解析响应结果
    String json = response.getSourceAsString();

    System.out.println(JSON.parseObject(json, HotelDoc.class));
}

文档更新

Java中演示

request.doc中当成键值对,两两匹配。

// 更新文档
@Test
void testUpdateDocument() throws IOException {
    // 1. Request准备
    UpdateRequest request = new UpdateRequest("hotel", "61083");
    // 准备请求参数
    request.doc(
            "price", "666",
            "starName", "四钻"
    );
    // 发送请求
    client.update(request, RequestOptions.DEFAULT);
}

文档删除

控制台中

/bunny/_doc/1:文档名称/_doc/文档id

# 删除文档
DELETE /bunny/_doc/1
Java中演示
// 删除文档
@Test
void testDeleteDocument() throws IOException {
    // 准备Request
    DeleteRequest request = new DeleteRequest("hotel", "61083");
    // 发送请求
    client.delete(request, RequestOptions.DEFAULT);
}

批量插入文档

在实际中,文档操作有时是批量的,所以将数据库中所有数据都转成文档,这时候需要遍历,需要注意的是经纬度在ES中有单独的规则,在转换时,需要将经纬度转为字符串类型。

格式为:维度,经度,如:hotel.getLatitude() + ", " + hotel.getLongitude();

Java中演示
// 批量插入文档
@Test
void testBulkRequest() throws IOException {
    BulkRequest request = new BulkRequest();
    // 批量查询
    List<Hotel> hotels = hotelService.list();
    hotels.forEach(hotel -> {
        // 转换为HotelDoc
        HotelDoc hotelDoc = new HotelDoc(hotel);
        // 创建文档的请求体
        IndexRequest source = new IndexRequest("hotel").id(hotel.getId().toString()).source(JSON.toJSONString(hotelDoc), XContentType.JSON);
        // 添加请求体
        request.add(source);
    });
    // 发送请求
    client.bulk(request, RequestOptions.DEFAULT);
}
otels.forEach(hotel -> {
        // 转换为HotelDoc
        HotelDoc hotelDoc = new HotelDoc(hotel);
        // 创建文档的请求体
        IndexRequest source = new IndexRequest("hotel").id(hotel.getId().toString()).source(JSON.toJSONString(hotelDoc), XContentType.JSON);
        // 添加请求体
        request.add(source);
    });
    // 发送请求
    client.bulk(request, RequestOptions.DEFAULT);
}

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

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

相关文章

实例、构造函数、原型、原型对象、prototype、__proto__、原型链……

学习原型链和原型对象&#xff0c;不需要说太多话&#xff0c;只需要给你看看几张图&#xff0c;你自然就懂了。 prototype 表示原型对象__proto__ 表示原型 实例、构造函数和原型对象 以 error 举例 图中的 error 表示 axios 抛出的一个错误对象&#xff08;实例&#xff0…

Makefile:动态库的编译链接与使用(六)

1、动态链接库 动态链接库&#xff1a;不会把代码编译到二进制文件中&#xff0c;而是运行时才去加载&#xff0c;所以只需要维护一个地址 动态&#xff1a;运行时才去加载&#xff0c;即所谓的动态加载连接&#xff1a;指库文件和二进制程序分离&#xff0c;用某种特殊的手段…

字符串的遍历,统计,反转.java

题目&#xff1a;键盘输入字符串&#xff0c;统计字符串所包含的大小写字母个数&#xff0c;及数字个数 分析&#xff1a;键盘输入字符串需next&#xff08;&#xff09;方法&#xff0c;利用fot循环遍历每个字符&#xff0c;返回字符串上的字符用charAt&#xff08;index&…

图论-最短路

一、不存在负权边-dijkstra算法 dijkstra算法适用于这样一类问题&#xff1a; 从起点 start 到所有其他节点的最短路径。 其实求解最短路径最暴力的方法就是使用bfs广搜一下&#xff0c;但是要一次求得所有点的最短距离我们不可能循环n次&#xff0c;这样复杂度太高&#xf…

Mac air 个人免费版VMWare Fusion安装及配置教程

Mac air 安装免费版VMWare Fusion教程及问题解决 1、下载VMWare Fusion2、下载wins镜像文件3、开始配置4、出现的问题及解决方法4.1 如何跳过启动时的网络连接4.2 启动后&#xff0c;无法连接网络怎么办4.3 怎么实现将文件拖拽到虚拟机中 当你手上是一台Mac电脑&#xff0c;却需…

薪酬、人数上不封顶,这家互联网大厂正在疯抢超级毕业生

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 发布在https://it.weoknow.com 更多资源欢迎关注 又是一年一度校园春招季。在生成式 AI 一路狂飙的时代浪潮下&#xff0c;人工…

Linux: 进程地址空间究竟是什么?进程地址空间存在意义何在?

Linux: 进程地址空间究竟是什么&#xff1f; 一、内存究竟是什么&#xff1f;分为哪些&#xff1f;二、内存是真实物理空间&#xff1f;三、进程地址空间&#xff08;虚拟地址&#xff09;3.1 为何同一个变量地址相同&#xff0c;保存的数据却不同&#xff1f; 四、为什么需要地…

ssm012医院住院管理系统+vue

医院住院管理关系 摘 要 随着时代的发展&#xff0c;医疗设备愈来愈完善&#xff0c;医院也变成人们生活中必不可少的场所。如今&#xff0c;已经2021年了&#xff0c;虽然医院的数量和设备愈加完善&#xff0c;但是老龄人口也越来越多。在如此大的人口压力下&#xff0c;医院…

3.31总结

这两天对于java知识的学习又收获了一些新的东西&#xff0c;如内部类、抽象类、接口、权限修饰符、代码块、final. final final多用于方法、类、变量的修饰 方法&#xff1a;表示该方法是最终方法&#xff0c;不能被重写 类&#xff1a;表明该类是最终类&#xff0c;不能被…

latex伪代码一些记录

参考一 参考二 参考三 使用minipage 最终调整好的效果&#xff1a; $ \begin{document} \begin{center} \begin{minipage}{15.92cm} \renewcommand{\thealgorithm}{1} \begin{CJK}{GBK}{song} \begin{algorithm}[H]\caption{ \text{算法1&#xff1a;xxx}}\begin{algorith…

Linux 基础IO [缓冲区文件系统]

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 一.Linux下一切皆文件 二.缓冲…

调试技巧安全预编译头文件(C++基础)

调试 调试可以选择条件调试和操作调试&#xff1a; 条件调试来选择条件进入断点设置&#xff0c;操作调试来使达到断点条件后完成某些操作&#xff08;一般是output窗口输出&#xff09;。 在这里就只输出了小于6的条件。 安全 降低崩溃、内存泄露、非法访问等问题。 应该转…

vue基础教程(5)——构建项目级登录页

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、创建首页二、登录页代码讲解三、对应的vue知识点&#xff1a;四、附件-各文件代码总结 前言 前面我们已经把vue自带的页面删除&#xff0c;也搭建了最简单的router路由&#xff0c;下面就可以真正开发我们自己的项目…

蓝桥杯-python-常用库归纳

目录 日期和时间 datetime模块 date日期类&#xff0c;time时间类&#xff0c;datetime日期时间类 定义date&#xff08;年&#xff0c;月&#xff0c;日&#xff09; data之间的减法 定义时间&#xff08;时&#xff0c;分&#xff0c;秒&#xff09; 定义datetime&#xf…

文献学习-23-MRM:用于遗传学医学图像预训练的掩码关系建模

MRM: Masked Relation Modeling for Medical Image Pre-Training with Genetics Authors: Qiushi Yang, Wuyang Li, Baopu Li, Yixuan Yuan Source: ICCV 2023 Abstract: 关于自动多模态医疗诊断的 ODERN 深度学习技术依赖于大量的专家注释&#xff0c;这既耗时又令人望而却…

DeepL Pro3.1 下载地址及安装教程

DeepL Pro是DeepL公司推出的专业翻译服务。DeepL是一家专注于机器翻译和自然语言处理技术的公司&#xff0c;其翻译引擎被认为在质量和准确性方面表现优秀.DeepL Pro提供了一系列高级功能和服务&#xff0c;以满足专业用户的翻译需求。其中包括&#xff1a; 高质量翻译&#xf…

Python 常用内置库 time库、random库、turtle库

文章目录 一、time库二、random库三、turtle库1. 绘制正方形2. 使用海龟对象绘制六边形3. 绘制多个起点相同大小不同起点的五角星4. 绘制多个图形和添加文字 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、time库 time是最基础的时间处理库&#…

系统慢查询的思考

系统慢查询的思考 在一个系统中发现慢查询的功能或很卡的现象。你是怎么思考的&#xff1f;从哪几个方面去思考&#xff1f;会用什么工具&#xff1f; 一个系统使用了几年后都可能会出现这样的问题。原因可能有以下几点。 数据量的增加。系统中平时的使用中数据量是有一个累…

HTML块级元素和内联元素(头部和布局)

目录 1.HTML块级和内联标签&#xff1a; 1.块级元素&#xff1a; 2.内联元素: 3.元素嵌套&#xff1a; 4.元素转换&#xff1a; 示例如下: 2.内联框架&#xff1a; 前言&#xff1a; 示例如下: 3.布局&#xff1a; 4.头部标签&#xff1a; 前言&#xff1a; 说明&…

GT收发器PHY层设计(3)PHY层设计

文章目录 前言一、设计框图二、PHY层基本传输协议三、PHY_TX模块3.1、模块接口3.2、组帧状态机描述3.3、数据大小端问题3.4、字节对齐 四、PHY_RX模块4.1、模块接口4.2、大小端转换4.3、起始位4.4、结束位4.5、axis数据流恢复 五、LFSR伪随机码六、链路空闲时期处理 前言 上一…