elasticsearch操作(API方式)

news2024/11/25 9:40:31

说明:es操作索引库、文档,除了使用它们自带的命令外(参考:http://t.csdn.cn/4zpmi),在IDEA中可以添加相关的依赖,使用对应的API来操作。

准备工作

搭建一个SpringBoot项目,DAO使用的MyBatis-Plus,对数据库中的学生表进行操作。

在这里插入图片描述

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.10.RELEASE</version>
        <relativePath/>
    </parent>

    <groupId>org.hzy</groupId>
    <artifactId>es_essay_demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <elasticsearch.version>7.12.1</elasticsearch.version>
    </properties>

    <dependencies>
        <!--spring web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--mybatis-plus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

        <!--数据库连接驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!--lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--测试依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--FastJson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.71</version>
        </dependency>

        <!--commons依赖-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
    </dependencies>
</project>

在此之上,导入RestHighLevelClient依赖,并指定版本,不然会使用SpringBoot自带版本,依靠此依赖实现对ES的一系列操作。

    <properties>
        <elasticsearch.version>7.12.1</elasticsearch.version>
    </properties>
    
	<!--RestHighLevelClient依赖-->
	<dependency>
	    <groupId>org.elasticsearch.client</groupId>
	    <artifactId>elasticsearch-rest-high-level-client</artifactId>
	</dependency>

编写与学生类相关的索引库DSL语句,注意这里特意把学生类中的创建日期、入学日期合并成一个joinInfo字段,后面添加文档时需要考虑到这点;

PUT /student
{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
        
      "username":{
        "type": "keyword",
        "copy_to": "all"
      },
        
      "password":{
        "type": "keyword",
        "index": false
      },
        
      "name":{
        "type": "text",
        "analyzer": "ik_max_word",
        "copy_to": "all"
      },

      "gender":{
        "type": "keyword"
      },
        
      "image":{
        "type": "keyword"
      },
        
      "job":{
        "type": "integer"
      },
	  
	  "joinInfo":{
		"type": "keyword"
	  },
        
      "updateTime":{
        "type": "keyword"
      },
        
        
      "all":{
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

将上面索引库的DSL语句,在IDEA中用一个常量来存储,以便后面使用,注意前面“PUT /student”需要去掉,只需要最外层花括号内的信息即可;

public class Constants {

    public static final String CREATE_INDEX_STRING = "{\n" +
            "  \"mappings\": {\n" +
            "    \"properties\": {\n" +
            "      \"id\": {\n" +
            "        \"type\": \"keyword\"\n" +
            "      },\n" +
            "        \n" +
            "      \"username\":{\n" +
            "        \"type\": \"keyword\",\n" +
            "        \"copy_to\": \"all\"\n" +
            "      },\n" +
            "        \n" +
            "      \"password\":{\n" +
            "        \"type\": \"keyword\",\n" +
            "        \"index\": false\n" +
            "      },\n" +
            "        \n" +
            "      \"name\":{\n" +
            "        \"type\": \"text\",\n" +
            "        \"analyzer\": \"ik_max_word\",\n" +
            "        \"copy_to\": \"all\"\n" +
            "      },\n" +
            "\n" +
            "      \"gender\":{\n" +
            "        \"type\": \"keyword\"\n" +
            "      },\n" +
            "        \n" +
            "      \"image\":{\n" +
            "        \"type\": \"keyword\"\n" +
            "      },\n" +
            "        \n" +
            "      \"job\":{\n" +
            "        \"type\": \"integer\"\n" +
            "      },\n" +
            "\t  \n" +
            "\t  \"joinInfo\":{\n" +
            "\t\t\"type\": \"keyword\"\n" +
            "\t  },\n" +
            "        \n" +
            "      \"updateTime\":{\n" +
            "        \"type\": \"keyword\"\n" +
            "      },\n" +
            "        \n" +
            "        \n" +
            "      \"all\":{\n" +
            "        \"type\": \"text\",\n" +
            "        \"analyzer\": \"ik_max_word\"\n" +
            "      }\n" +
            "    }\n" +
            "  }\n" +
            "}";
}

索引库(index)操作

为了后面操作方便,把RestHighLevelClient的定义、创建、关闭放在方法外面,以下操作都是在测试类中实现;

    /**
     * 定义连接
     */
    private RestHighLevelClient client;

    /**
     * 初始化客户端
     */
    @BeforeEach
    public void init(){
        client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.126.128:9200")));
    }

    /**
     * 关闭客户端
     * @throws IOException
     */
    @AfterEach
    public void close() throws IOException {
        client.close();
    }

创建索引库

    /**
     *  创建索引
     */
    @Test
    public void addIndex() throws IOException {
        // 1.创建请求
        CreateIndexRequest createIndexRequest = new CreateIndexRequest("student");

        // 2.编写DSL语句
        createIndexRequest.source(CREATE_INDEX_STRING, XContentType.JSON);

        // 3.发起请求
        client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
    }

执行成功

在这里插入图片描述

到ikbana上看下,索引库已经创建完成

在这里插入图片描述

获取索引库

    /**
     * 获取索引库
     * @throws IOException
     */
    @Test
    public void getIndex() throws IOException {
        // 1.创建请求
        GetIndexRequest getIndexRequest = new GetIndexRequest("student");

        // 2.发起请求
        boolean exists = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT);

        System.out.println("exists = " + exists);
    }

此方法返回结果为boolean类型,仅可知该索引库是否存在;

在这里插入图片描述

删除索引库

    /**
     * 删除索引库
     * @throws IOException
     */
    @Test
    public void deleteIndex() throws IOException {
        // 1. 创建请求
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("student");

        // 2. 发起请求
        client.indices().delete(deleteIndexRequest,RequestOptions.DEFAULT);
    }

删除索引库成功;

在这里插入图片描述

再次获取索引库,返回false;

在这里插入图片描述

小结

索引库没有修改操作

文档(document)操作

再提一次,文档操作等同于数据库的数据操作,即类比数据的CRUD操作;

新增文档

注意,因为数据库中查询到的记录与ES的文档的字段并不是一一对应的,需要再创建一个对象来进行拼凑;

(Student类)

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.io.Serializable;

@Data
@TableName("tb_student")
public class Student implements Serializable {
    private Integer id;
    private String username;
    private String password;
    private String name;
    private Integer gender;
    private String image;
    private Integer job;
    private String entryDate;
    private String createTime;
    private String updateTime;
}

(StudentDoc类,与ES文档一一对应)

import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@NoArgsConstructor
public class StudentDoc implements Serializable {
    private Integer id;
    private String username;
    private String password;
    private String name;
    private Integer gender;
    private String image;
    private Integer job;
    private String joinInfo;
    private String updateTime;

    public StudentDoc(Student student) {
        this.id = student.getId();
        this.username = student.getUsername();
        this.password = student.getPassword();
        this.name = student.getName();
        this.gender = student.getGender();
        this.image = student.getImage();
        this.job = student.getJob();
        this.joinInfo = "[创建日期:" + student.getCreateTime() + "], [加入日期:" + student.getEntryDate() +"]";
        this.updateTime = student.getUpdateTime();
    }
}
    /**
     * 新增文档(数据来自数据库,然后新增到ES)
     */
    @Test
    public void addDoc() throws IOException {
        // 1.查询数据(ID为1的记录)
        Student student = studentService.getById(1);
		
		// 1.1 拼凑文档
        StudentDoc studentDoc = new StudentDoc(student);

        // 2.创建请求
        IndexRequest request = new IndexRequest("student").id(student.getId().toString());

        // 3.编写DSL语句
        request.source(JSON.toJSONString(studentDoc),XContentType.JSON);

        // 4.发送请求
        client.index(request,RequestOptions.DEFAULT);
    }

执行完成;

在这里插入图片描述

查看kibana平台,输入命令,可以查到对应的文档,说明新增文档成功;

在这里插入图片描述

查询文档

    /**
     * 查询文档
     */
    @Test
    public void getDoc() throws IOException {
        // 1.创建请求,查询ID为1的文档
        GetRequest request = new GetRequest("student").id("1");

        // 2.发送请求
        GetResponse response = client.get(request, RequestOptions.DEFAULT);

        // 3.获取返回值
        String json = response.getSourceAsString();

        // 4.解析返回值为java对象
        StudentDoc studentDoc = JSON.parseObject(json, StudentDoc.class);

        System.out.println("studentDoc = " + studentDoc);
    }

查询完成;

在这里插入图片描述

删除文档

    /**
     * 删除文档
     */
    @Test
    public void delDoc() throws IOException {
        // 1.创建请求,删除ID为1的文档
        DeleteRequest request = new DeleteRequest("student").id("1");

        // 2.发起请求
        client.delete(request, RequestOptions.DEFAULT);
    }

执行完成;

在这里插入图片描述
再次查询,结果为null(注意,并不会报错);

在这里插入图片描述

更新文档

更新文档由两种方式,第一种是全局更新,其实也就是新增文档,代码是一样的,第二种是局部更新,代码如下:

    /**
     * 更新文档(方式二:局部更新)
     */
    @Test
    public void updateDoc() throws IOException {
        // 1.创建请求,修改ID为1的文档
        UpdateRequest request = new UpdateRequest("student","1");

        // 2.指定要修改的字段
        request.doc("name","徐志摩",
                "username","xuzhimo");

        // 3.发送请求
        client.update(request,RequestOptions.DEFAULT);
    }

执行完成;

在这里插入图片描述
再次查找ID为1的文档,可以看到文档已更新;

在这里插入图片描述

批量导入文档

批量将数据库中的对象数据,导入到ES上;

    /**
     * 批量导入文档(数据从数据库中查询获取)
     */
    @Test
    public void addDocs() throws IOException {
        // 1.获取所有学生的数据
        List<Student> students = studentService.list();

        // 2.创建Bulk请求
        BulkRequest bulkRequest = new BulkRequest();

        // 3.添加数据到Bulk中
        for (Student student : students) {
            // 3.1 创建Doc对象
            StudentDoc studentDoc = new StudentDoc(student);

            // 3.2 创建新增文档请求并将Doc对象放入
            bulkRequest.add(new IndexRequest("student").id(studentDoc.getId().toString())
                    .source(JSON.toJSONString(studentDoc),XContentType.JSON));
        }

        // 4.发送请求
        client.bulk(bulkRequest,RequestOptions.DEFAULT);
    }

执行完成,没有报错;

在这里插入图片描述

随便查找两条记录,可以看到都已经添加了进来;

在这里插入图片描述
在这里插入图片描述

总结

对于索引库的操作,请求是XxxIndexRequest(“索引库名”),创建是Create,删除是Delete,获取是Get(发起请求,方法名是exists);

对于文档的操作,请求是XxxRequest(“索引库名”,“ID”),新增是Index,删除是Delete,查询是Get,修改是Update,另外还有个批量的操作,是BulkRequest;

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

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

相关文章

为什么 Linux 内核协议栈会丢弃 SYN 数据包

最近了解到 SYN 数据包丢弃的问题&#xff0c;网上有一些资料&#xff0c;这里记录分享一下。 serverfault上的重要信息 tcp - No SYN-ACK Packet from server - Server Fault 信息如下&#xff1a; My embedded system with LwIP is the client and I have server1 and ser…

微信小程序开发,小程序类目符合,线上版本无权限申请wx.getLocation接口

我开发 的小程序类目符合wx.getLocation接口的申请标准 但是却还是显示无权限申请 后来研究好久才发现&#xff0c;小程序需要在发布线上版本时提交用户隐私保护指引 如未设置也可以在 设置-服务内容声明-用户隐私保护指引-声明处理用户信息项并补充填写后提交用户隐私协议审核…

MURF20100CTR-ASEMI快恢复对管封装、尺寸、参数

编辑&#xff1a;ll MURF20100CTR-ASEMI快恢复对管封装、尺寸、参数 型号&#xff1a;MURF20100CTR 品牌&#xff1a;ASEMI 芯片个数&#xff1a;2 芯片尺寸&#xff1a;102MIL*2 封装&#xff1a;TO-220F 恢复时间&#xff1a;50ns 工作温度&#xff1a;-50C~150C 浪…

k8s集群环境的搭建

1.环境规划 1.1 集群类型 Kubernetes集群大致分为两类&#xff1a;一主多从和多主多从。 一主多从&#xff1a;一个Master节点和多台Node节点&#xff0c;搭建简单&#xff0c;但是有单机故障风险&#xff0c;适合用于测试环境。 多主多从&#xff1a;多台Master和多台Node节点…

CMU 15-445 -- Two Phase Locking - 14

CMU 15-445 -- Two Phase Locking - 14 引言Lock TypesTwo-Phase LockingDeadlock Detection & PreventionDeadlock DetectionDeadlock PreventionHierarchical Lockingintention locks加锁协议 锁升级最佳实践显式加锁的相关SQL语句小结 引言 本系列为 CMU 15-445 Fall 2…

剑指offer(C++)-JZ15:二进制中1的个数(算法-位运算)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 输入一个整数 n &#xff0c;输出该数32位二进制表示中1的个数。其中负数用补码表示。 数据范围&#xf…

【运维】DevOps全流程笔记(未完成)

运维笔记 DevOps基本流程Code阶段工具&#xff08;gitlab安装&#xff09;Build阶段工具&#xff08;Maven安装&#xff09;Integrate阶段工具JenkinsJenkins介绍Jenkins安装Jenkins入门配置 CI/CD操作集成Sonar Qube集成HarborJenkins流水线Kubernetes编排工具 DevOps全流程笔…

OJ练习第144题——将数组和减半的最少操作次数

将数组和减半的最少操作次数 力扣链接&#xff1a;2208. 将数组和减半的最少操作次数 题目描述 给你一个正整数数组 nums 。每一次操作中&#xff0c;你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。&#xff08;注意&#xff0c;在后续操作中你可以对减半过的数…

基于YOLOv5的WiderFace人脸检测检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于YOLOv5的WiderFace人脸检测系统可用于日常生活中检测与定位人脸目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的人脸目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练数据集&…

ffplay播放器剖析(6)----音视频同步分析

文章目录 1. 音视频同步基础1.1 音视频同步策略1.2 音视频同步概念1.3 FFmpeg中的时间单位1.4 不同结构体的time_base/duration分析1.5 不同结构体的pts/dts分析1.6 ffplay中Frame结构体分析1.7 Vidoe Frame PTS获取及矫正1.8 Audio Frame PTS的获取 2.以音频为基准3.以视频为基…

了解Unity编辑器之组件篇Tilemap(五)

Tilemap&#xff1a;用于创建和编辑2D网格地图的工具。Tilemap的主要作用是简化2D游戏中地图的创建、编辑和渲染过程。以下是一些Tilemap的主要用途&#xff1a; 2D地图绘制&#xff1a;Tilemap提供了一个可视化的编辑器界面&#xff0c;可以快速绘制2D地图&#xff0c;例如迷…

jlink RTT调试 NRF52840

打开 J-Link RTT Viewer 搜索&#xff1a;**J-Link RTT Viewer ** 软件部分 代码部分 #include <stdbool.h> #include <stdint.h> #include "nrf_delay.h" #include "boards.h" //Log需要引用的头文件 #include "nrf_log.h"…

音频转换工具有很多,但是找到好用的还是得看这篇

在日常生活中&#xff0c;我们常常会遇到需要将音频文件转换成不同格式的情况。不过&#xff0c;有些音频转换软件可能需要安装繁琐的插件&#xff0c;这对于一些小伙伴来说可能不太方便。幸运的是&#xff0c;如今有许多免费的音频转换格式软件可供选择&#xff0c;让我们能够…

K3S 安装部署

一、方法1&#xff1a;利用官方源&#xff08;国外源&#xff09;直接一键安装 因 K3s 的核心组件镜像需从 gcr.io 拉取&#xff08;国内网络不通&#xff09;&#xff0c;所以需具备外网访问的环境&#xff0c;适用于服务器均在国外的环境选用&#xff0c;简单粗暴一键安装。…

mysql进阶1——proxysql中间件

文章目录 一、基本了解二、安装部署三、proxysql管理配置3.1 内置库3.1.1 main库表3.1.2 stats库表3.1.3 monitor库 3.2 常用管理变量3.2.1 添加管理用户3.2.2 添加普通用户3.2.3 修改监听套接字 四、多层配置系统4.1 系统结构4.2 修改变量加载配置4.3 启动加载流程 一、基本了…

聊一聊什么是JNDI数据源

大家好&#xff0c;我是G探险者。 我们平时开发项目&#xff0c;连接数据库那块&#xff0c;会采用连接池的方式连进行连接数据库&#xff0c;比如常见的durid,dbcp&#xff0c;c3p0等。那你有没有听过还有一个JNDI数据源呢&#xff0c;反正我以前是很少听说过。可能就是因为自…

梅尔频谱(Mel spectrum)简介及Python实现

梅尔频谱&#xff08;Mel spectrum&#xff09;简介及Python实现 1. 梅尔频谱&#xff08;Mel spectrum&#xff09;简介2. Python可视化测试3.频谱可视化3.1 Mel 频谱可视化3.2 STFT spectrum 参考文献资料 1. 梅尔频谱&#xff08;Mel spectrum&#xff09;简介 在信号处理上…

wordpress框架自定义添加page分页功能

先来看效果图&#xff1a; 一、在主题目录下的functions.php文件里&#xff0c;添加如下分页函数&#xff1a; /** * 数字分页函数 * 说明&#xff1a;因为wordpress默认仅仅提供简单分页&#xff0c;所以要实现数字分页&#xff0c;需要自定义函数 * Param bool $isHome 是…

工业静电监控系统的功能介绍

工业静电监控系统是一种用于监测和控制工业生产过程中静电现象的技术系统。静电是指由于物体间的电荷不平衡而产生的电场现象&#xff0c;它在工业生产中可能导致电击、火花、电磁干扰等质量问题。 工业静电监控系统主要通过使用静电传感器和控制设备来实现对静电场的监测和控…

Java反序列化(0):URLDNS的反序列化调试分析

URLDNS链子是Java反序列化分析的第0课&#xff0c;网上也有很多优质的分析文章。 笔者作为Java安全初学者&#xff0c;也从0到1调试了一遍&#xff0c;现在给出调试笔记。 一. Java反序列化前置知识 Java原生链序列化&#xff1a;利用Java.io.ObjectInputStream对象输出流的w…