袁庭新ES系列15节|Elasticsearch客户端基础操作

前言

上一章节我们介绍了搭建Elasticsearch集群相关的知识。那么又该如何来操作Elasticsearch集群呢?在ES官网中提供了各种语言的客户端,我们在项目开发过程中有多种Elasticsearch版本和连接客户端可以选择,那么他们有什么区别?这一章节袁老师带领大家来学习Elasticsearch客户端相关的内容。

一. ES客户端介绍

在Elasticsearch官网中提供了各种语言的客户端:Elasticsearch Clients | Elastic。


客户端

优点

缺点

说明

Java Low Level Rest Client

与ES版本之间没有关系,适用于作为所有版本ES的客户端

低级别的REST客户端,通过HTTP与集群交互,用户需自己编组请求JSON串,及解析响应JSON串

不建议使用

Java High Level Rest Client

官方推出的,版本与ES同步更新

使用的版本需要保持和ES服务端的版本一致,否则会有版本问题

强烈推荐使用。基于Low Level Rest Client,它提供了更多的接口。注意:7.15版本之后将被弃用

TransportClient

启动速度快,轻量级,可创建极多连接,与应用程序解耦;推荐使用原生的,ES本身就很简单,灵活性很高

JAR包版本需与ES集群版本一致,ES集群升级,客户端也跟着升级到相同版本

不建议使用。过时产品,7版本之后不再支持

Elasticsearch Java API Client

最新的ES客户端。Elasticsearch Java API Client通过API的方式来组装请求数据,避免直接编写JSON字符串

文档少

使用人较少

注意点击进入后,选择版本到6.2.4版本 ,因为我们之前按照的都是6.2.4版本讲解的。进入后可以通过官方文档了解和学习Java客户端相关的知识。

二. 搭建工程环境

1.创建一个Spring Initalizr类型的项目,项目名称设置为【es-client】。

2.创建项目时,勾选Lombok、Spring Boot DevTools和Spring Web依赖。

注意:这里我们直接导入了SpringBoot的启动器,方便后续讲解。

3.将resource目录下自动生成的application.properties文件修改成application.yml。

4.在项目的pom.xml文件中手动引入Elasticsearch的High-level-Rest-Client等相关的依赖。

<?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 https://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.7.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yx</groupId>
    <artifactId>es-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>es-client</name>
    <description>es-client</description>
    <properties>
        <java.version>11</java.version>
    </properties>
  
    <dependencies>
      
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
      
        <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>
        </dependency>
      
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
      
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
      
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.8.1</version>
        </dependency>
      
        <!-- Apache开源组织提供的用于操作Java Bean的工具包 -->
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.1</version>
        </dependency>
      
        <!-- ES高级Rest Client -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.4.3</version>
        </dependency>
      
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.4.3</version>
        </dependency>
      
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
      
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

三. 索引库及映射

创建索引库的同时,我们也会创建type及其映射关系,但是这些操作不建议使用Java客户端完成,原因如下:

  • 索引库和映射往往是初始化时完成,不需要频繁操作,不如提前配置好。
  • 官方提供的创建索引库及映射API非常繁琐,需要通过字符串拼接JSON结构。

因此,这些操作建议还是使用我们之前学习的Rest风格API去实现。

在项目的com.yx.pojo包下创建Product商品类,以这样一个商品数据为例来创建索引库。

package com.yx.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product {
    private Long id; // 主键
    private String title; // 标题
    private String category; // 分类
    private String brand; // 品牌
    private Double price; // 价格
    private String images; // 图片地址
}

分析一下数据结构:

属性

描述

id

可以认为是主键,将来判断数据是否重复的标识,不分词,可以使用keyword类型

title

搜索字段,需要分词,可以用text类型

category

商品分类,这个是整体,不分词,可以使用keyword类型

brand

品牌,与分类类似,不分词,可以使用keyword类型

price

价格,这个是double类型

images

图片,用来展示的字段,不搜索,index为false,不分词,可以使用keyword类型

使用Kibana控制台向集群中创建yx索引库并编写映射配置(如果之前创建过yx索引库则先删除)。

PUT /yx
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  },
  "mappings": {
    "product": {
      "properties": {
        "id": {
          "type": "keyword"
        },
        "title": {
          "type": "text",
          "analyzer": "ik_max_word"
        },
        "category": {
          "type": "keyword"
        },
        "brand": {
          "type": "keyword"
        },
        "price": {
          "type": "double"
        },
        "images": {
          "type": "keyword",
          "index":  false
        }
      }
    }
  }
}

四. 索引数据操作

有了索引库之后,我们接下来看看如何对索引库中的数据进行增删改查操作。操作MySQL数据库:

1.获取数据库连接。

2.完成数据的增删改查操作。

3.释放资源。

1.初始化客户端

对索引库做任何操作,都需要通过RestHighLevelClient客户端来完成。

1.在项目的test测试文件夹下创建com.yx.es包,并在该包下创建一个ElasticsearchTests测试类。

2.然后在ElasticsearchTests类中编写RestHighLevelClient客户端的初始化方法init()和关闭方法close()。

package com.yx.es;
import com.google.gson.Gson;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.After;
import org.junit.Before;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;

@SpringBootTest
public class ElasticsearchTests {
    private RestHighLevelClient restHighLevelClient;
    // JSON工具
    private Gson gson = new Gson();

    /** 初始化客户端 */
    @Before
    public void init() {
        RestClientBuilder restClientBuilder = RestClient.builder(
            new HttpHost("127.0.0.1", 9201, "http"),
            new HttpHost("127.0.0.1", 9202, "http"),
            new HttpHost("127.0.0.1", 9203, "http")
        );
        restHighLevelClient = new RestHighLevelClient(restClientBuilder);
    }

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

2.新增文档

新增文档的实现是,先将数据封装到POJO对象中,然后通过restHighLevelClient对象来向索引库中新增数据。

2.1.新增文档实现

1.在ElasticsearchTests类中编写新增文档的insert()方法。

/** 新增文档 */
@Test
public void insert() throws IOException {
    // 1.文档数据
    Product product = new Product();
    product.setId(1L);
    product.setTitle("华为P60震撼发布");
    product.setCategory("手机");
    product.setBrand("华为");
    product.setPrice(6999.99);
    product.setImages("http://image.huawei.com/1.jpg");

    // 2.将文档数据转换为JSON格式
    String source = gson.toJson(product);

    // 3.创建索引请求对象,访问哪个索引库、哪个type、指定文档ID
    IndexRequest request = new IndexRequest("yx", "product", product.getId().toString());
    request.source(source, XContentType.JSON);

    // 4.发送请求
    IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
    System.err.println(response);
}

2.运行insert()方法,输出结果见下:

IndexResponse[index=yx,type=product,id=1,version=2,result=updated,seqNo=1,primaryTerm=1,shards={"total":2,"successful":2,"failed":0}]

3.运行insert()方法可能会报错,具体解决方案见下。

2.2.新增文档异常

1.如果导入Elasticsearch依赖时不指定其版本,可能导致找不到XContentType类。解决的方案就是在pom.xml文件中手动添加Elasticsearch对应版本的依赖,比如手动指定Elasticsearch的版本为6.4.3。如果没有这个问题,则忽略此步骤。

<dependency>
  <groupId>org.elasticsearch</groupId>
  <artifactId>elasticsearch</artifactId>
  <version>6.4.3</version>
</dependency>

2.如果运行insert()方法提示java.lang.NullPointerException空指针异常,则可能的原因是@Test注解的包导入错误,注意导入的包是org.junit.Test而非org.junit.jupiter.api.Test。

3.查看文档

根据Rest风格,查看文档是根据文档id进行GET查询操作,难点是对结果的解析。

1.在ElasticsearchTests类中编写查看文档的select()方法。

/** 查看文档 */
@Test
public void select() throws IOException {
    // 创建GET请求并指定id
    GetRequest request = new GetRequest("yx", "product", "1");
    // 查询,得到响应
    GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
    // 获得响应结果数据
    String source = response.getSourceAsString();
    // 转化为JSON数据
    Product product = gson.fromJson(source, Product.class);

    System.err.println(product);
}

2.运行select()方法,输出结果见下:

Product(id=1, title=华为P60震撼发布, category=手机, brand=华为, price=6999.99, images=http://image.huawei.com/1.jpg)

4.修改文档

新增文档时,如果传递的id是已经存在的,则会完成修改文档操作,如果id不存在,则是新增文档操作。

1.在ElasticsearchTests类中编写修改文档的update()方法。

/** 修改文档 */
@Test
public void update() throws IOException {
    // 1.文档数据
    Product product = new Product();
    product.setId(1L); // id存在则为修改操作
    product.setTitle("华为P60直降1000");
    product.setPrice(5999.99);

    // 2.将文档数据转换为JSON格式
    String source = gson.toJson(product);

    // 3.创建索引请求对象,访问哪个索引库、哪个type、指定文档ID
    IndexRequest request = new IndexRequest("yx", "product", product.getId().toString());
    request.source(source, XContentType.JSON);
    
	// 4.发送请求
    IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
    System.err.println(response);
}

2.运行update()方法,输出结果见下:

IndexResponse[index=yx,type=product,id=1,version=2,result=updated,seqNo=1,primaryTerm=1,shards={"total":2,"successful":2,"failed":0}]

5.删除文档

根据id删除文档。

1.在ElasticsearchTests类中编写删除文档的delete()方法。

/** 删除文档 */
@Test
public void delete() throws IOException {
    // 准备删除的请求,参数为id
    DeleteRequest request = new DeleteRequest("yx", "product", "1");
    // 发起请求
    DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
    System.err.println(response);
}

2.运行delete()方法,输出结果见下:

DeleteResponse[index=yx,type=product,id=1,version=3,result=deleted,shards=ShardInfo{total=2, successful=2, failures=[]}]

五. 结语

Elasticsearch客户端基础部分的内容袁老师就给大家介绍完了。回顾下这一章节我们学习的主要内容,介绍了ES客户端项目工程搭建、索引库及映射、索引数据操作,主要重点介绍了索引数据的增删改查操纵。关于ES客户端基础部分的内容就介绍到这里,下一章节袁老师带领大家学习Elasticsearch客户端高级操作部分的内容。

今天的内容就分享到这里吧。关注「袁庭新」,干货天天都不断!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp Android 插件开发教程

一、下载uniapp提供的SDK Android 离线SDK - 正式版 | uni小程序SDK 二、在uniapp创建一个项目 查看包名&#xff1a;发行--> 原生app 云打包 三、进入dcloud官网 开发者中心 进入 应用管理 --> 我的应用 --> 点击应用名称-->各平台信息-->新增 这里需要这…

【可视化大屏开发】19. 加餐-百度地图API实现导航加线路热力图

需求 Web端使用场景中会涉及到地图导航路线情况&#xff0c;并利用热力图显示路况信息。 实现效果如下&#xff1a; 输入起始地点&#xff0c;选择并开始导航 最终效果 思路步骤 利用百度地图API显示地图交通拥堵情况的热力图&#xff0c;需要按照以下步骤进行开发 步骤1&a…

面试被问懵了:手撕 Transformer

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今年最大…

Vue入门篇:概念,快速入门,插值表达式,核心特性,基本Vue指令

目录 1.Vue是什么2.快速入门3.插值表达式{{}}1.作用:2.语法:3.插值表达式的注意点: 4.Vue响应式核心特性5.Vue指令 1.Vue是什么 Vue是一个流行的JavaScript框架&#xff0c;用于构建用户界面。它是一种用于构建单页面应用程序&#xff08;SPA&#xff09;的渐进式框架&#xff…

MySQL 列数据跨表拷贝,一句SQL快速将表A每条记录的某些字段拷贝到表B每条记录的某些字段(A、B表通过ID等字段对应)

文章目录 MySQL 列数据跨表拷贝&#xff0c;一句SQL快速将表A每条记录的某些字段拷贝到表B每条记录的某些字段&#xff08;A、B表通过ID等字段对应&#xff09;背景定义表填充测试数据跨表一 一对应拷贝列数据SQL参考资料 MySQL 列数据跨表拷贝&#xff0c;一句SQL快速将表A每条…

【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字

目录 一&#xff0c;函数重载1.1 函数重载的定义1.1.1.形参的类型不同1.1.2参数的个数不同1.1.3.参数的顺序不同1.1.4.有一个是缺省参数构成重载。但是调用时存在歧义1.1.5.返回值不同&#xff0c;不构成重载。因为返回值可接收&#xff0c;可不接受&#xff0c;调用函数产生歧…

Python 比较文本文件

1、问题背景 我们需要比较一个文本文件 F 与路径下多个其他文本文件之间的差异。我们已经编写了以下代码&#xff0c;但只能输出一个文件的比较结果。我们需要修改代码&#xff0c;以便比较所有文件并打印所有结果。 import difflib import fnmatch import osfilelist[] f op…

Don‘t fly solo! 量化之路,AI伴飞

在投资界&#xff0c;巴菲特与查理.芒格的神仙友谊&#xff0c;是他们财富神话之外的另一段传奇。巴菲特曾这样评价芒格&#xff1a;他用思想的力量拓展了我的视野&#xff0c;让我以火箭的速度&#xff0c;从猩猩进化到人类。 人生何幸能得到一知己。如果没有这样的机缘&…

使用共振峰提取元音音素/从声音生成口型动画

视频效果 我前段时间研究了下从声音提取共振峰的方法。今天测试了下实际效果。 我使用一段33秒的女声视频&#xff0c;提取元音后使用静态视位图序列生成了一个视频&#xff0c;效果如下&#xff1a; b站视频&#xff1a; https://www.bilibili.com/video/BV1JD421H7m9/?vd_…

泛型的初步认识(2)

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x…

MYSQL之增删改查(中)

前言&#xff1a; 以下是MySQL最基本的增删改查语句&#xff0c;很多IT工作者都必须要会的命令&#xff0c;也 是IT行业面试最常考的知识点&#xff0c;由于是入门级基础命令&#xff0c;所有所有操作都建立在单表 上&#xff0c;未涉及多表操作。 4、“查”——之单表查询 My…

html select 支持内容过滤列表 -bootstrap实现

实现使用bootstrap-select插件 http://silviomoreto.github.io/bootstrap-select <!DOCTYPE html> <html> <meta charset"UTF-8"> <head><title>jQuery bootstrap-select可搜索多选下拉列表插件-www.daimajiayuan.com</title>&…

部署ELFK+zookeeper+kafka架构

目录 前言 一、环境部署 二、部署ELFK 1、ELFK ElasticSearch 集群部署 1.1 配置本地hosts文件 1.2 安装 elasticsearch-rpm 包并加载系统服务 1.3 修改 elasticsearch 主配置文件 1.4 创建数据存放路径并授权 1.5 启动elasticsearch是否成功开启 1.6 查看节点信息 …

面试不慌张:一文读懂FactoryBean的实现原理

大家好&#xff0c;我是石头~ 在深入探讨Spring框架内部机制时&#xff0c;FactoryBean无疑是一个关键角色&#xff0c;也是面试中经常出现的熟悉面孔。 不同于普通Java Bean&#xff0c;FactoryBean是一种特殊的Bean类型&#xff0c;它的存在并非为了提供业务逻辑&#xff0c;…

使用Python进行自动化测试

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 如何使用Python进行自动化测试&#xff1a;测试框架的选择与应用 自动化测试是软件开发过程…

代码随想录算法训练营DAY28|C++回溯算法Part.4|93.复原IP地址、78.子集、90.子集II

文章目录 93.复原IP地址思路确定非法的范围树形结构 伪代码 78.子集思路伪代码实现CPP代码 90.子集II思路CPP代码用used去重的办法用set去重的版本不使用used数组、set的版本 93.复原IP地址 力扣题目链接 文章讲解&#xff1a;93.复原IP地址 视频讲解&#xff1a;回溯算法如何分…

curlftpfs和fusermount

curlftpfs 是一种 Linux 系统下用来将 FTP 服务器挂载为文件系统的工具&#xff0c;这意味着可以通过本地目录来访问和操作 FTP 服务器上的文件。 挂载FTP服务器到本地系统 为了挂载FTP服务器到本地系统中&#xff0c;使用curlftpfs工具&#xff0c;可以按照以下格式书写命令…

如何通过MSTSC连接Ubuntu的远程桌面?

正文共&#xff1a;666 字 12 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们介绍了如何通过VNC连接Ubuntu 18.04的远程桌面&#xff08;Ubuntu 18.04开启远程桌面连接&#xff09;&#xff0c;非常简单。但是有小伙伴咨询如何使用微软的远程桌面连接MSTSC&#xff08…

黑灰产行业简介

参考&#xff1a;2021年黑灰产行业研究及趋势洞察报告 1. 有哪些场景面临大量黑灰产攻击&#xff1f; 1.营销活动场景 -- 该场景最为猖獗 1. 抹机及接码注册&#xff1a;黑灰产会使用抹机工具修改设备参数伪装成一台新设备&#xff0c;再配合联系卡商进行手机号接码&#xf…

项目7-音乐播放器3(删除模块+播放音乐模块设计)

1.播放音乐模块设计 1.1 请求响应设计 请求&#xff1a; { get, /music/get?pathxxx.mp3 } 响应&#xff1a; { 音乐数据本身的字节信息 } 1.2 后端代码 1. Files.readAllBytes(String path) : 读取文件中的所有字节&#xff0c;读入内存 &#xff…
最新文章