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

news2024/11/16 23:40:22

前言

上一章节我们介绍了搭建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.coloradmin.cn/o/1611095.html

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

相关文章

Clion 2023.1.5 最新详细破解安装教程

CLion 最大的优点是跨平台&#xff0c;在Linux、Mac、Windows 上都可以运行。CLion 还同时支持 GCC、Clang、MSVC 这 3 种编译器&#xff0c;使用 CLion 编写程序&#xff0c;程序员可以根据需要随意切换使用的编译器。 第一步: 下载最新的 Clion 2023.1.5 版本安装包 我们先…

(2022级)成都工业学院数据库原理及应用实验五: SQL复杂查询

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求&#xff0c;请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 在实验三的基础上完成下列查询&#xff1a; 1、查询医生…

项目管理-项目开发计划介绍

目录 一、内容总览 二、项目开发计划概述 2.1 概述 2.2 项自开发计划的目的和作用 2.3 项目开发计划的内容 2.3.1 工作计划 2.3.2 人员组织计划 2.3.3 设备采购和资源供应计划 2.3.4 配置管理计划 2.3.5 进度安排计划 2.3.6 成本投资计划 2.3.7 质量保证计划 2.3.8…

Unity Editor编辑器扩展之创建脚本

前言 既然你看到这篇文章了&#xff0c;你是否也有需要使用代码创建脚本的需求&#xff1f;使用编辑器扩展工具根据不同的表格或者新增的内容去创建你想要的脚本。如果不使用工具&#xff0c;那么你只能不断去修改某个脚本&#xff0c;这项工作既繁琐也浪费时间。这个时候作为程…

Electron+Vue3整合 - 开发时状态整合

说明 本文介绍一下 Electron Vue3 的整合的基本操作。实现的效果是 &#xff1a; 1、一个正常的Vue3项目&#xff1b; 2、整合加入 Electron 框架 &#xff1a;开发时 Electron 加载的是开发的vue项目&#xff1b;步骤一&#xff1a;创建vue3项目 常规操作&#xff0c;不再赘…

盲人购物指南:智能化辅助引领超市购物新体验

作为一名资深记者&#xff0c;我有幸见证了一位盲人朋友借助一款名为蝙蝠避障的高科技辅助应用&#xff0c;独立完成超市购物之旅&#xff0c;这一过程充分展示了盲人购物指南新时代的到来。 在前往超市的路上&#xff0c;这款应用犹如一位贴心的“电子向导”&#xff0c;实时为…

Vue【路由】

1&#xff1a;什么是单页应用程序&#xff08;single page application&#xff09; 所有得功能在一个html页面上实现 2&#xff1a;单页面应用程序的优缺点 优点&#xff1a;按需更新性能高&#xff0c;开发效率也高&#xff0c;用户的体验较好 缺点&#xff1a;学习成本高…

学习-官方文档编辑方法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

高效编程工具 JetBrains CLion 2024 中文激活 mac/win

在追求编程高效与精准的道路上&#xff0c;JetBrains CLion 2024 for Mac无疑是您的最佳伙伴。这款专为Mac用户打造的C/C集成开发环境&#xff0c;凭借其强大的功能和出色的性能&#xff0c;赢得了广大开发者的青睐。 CLion 2024拥有智能的代码编辑器和强大的代码分析工具&…

超越GPT-4V,苹果多模态大模型上新,神经形态计算加速MLLM(一)

4月8日&#xff0c;苹果发布了其最新的多模态大语言模型&#xff08;MLLM &#xff09;——Ferret-UI&#xff0c;能够更有效地理解和与屏幕信息进行交互&#xff0c;在所有基本UI任务上都超过了GPT-4V&#xff01; 苹果开发的多模态模型Ferret-UI增强了对屏幕的理解和交互&am…

解锁棋盘之谜:探索N皇后问题的全方位解决策略【python 力扣51题】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

【Qt 学习笔记】Qt常用控件 | 显示类控件Label的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 显示类控件Label的使用及说明 文章编号&#xff1a;Qt 学…

AOP基础-动态代理

文章目录 1.动态代理1.需求分析2.动态代理的核心3.代码实例1.Vehicle.java2.Car.java3.Ship.java4.VehicleProxyProvider.java(动态代理模板)5.测试使用 2.动态代理深入—横切关注点1.需求分析2.四个横切关注点3.代码实例1.Cal.java2.CalImpl.java3.VehicleProxyProvider02.jav…

iOS重签名-超详细,附排错

文章目录 重签名步骤步骤 1: 准备必要的材料步骤 2: 解压 .ipa 文件步骤3:将 Provisioning Profile 复制到 Payload 目录步骤 4: 移除原来的签名步骤 5: 使用新的证书和 Provisioning Profile 进行重签名步骤 6: 重新打包 .ipa 文件步骤 7: 安装和测试得到provisioning file和…

语音转换中的扩散模型——DDDM-VC

DDDM-VC: Decoupled Denoising Diffusion Models with Disentangled Representation and Prior Mixup for Verifed Robust Voice Conversion https://ojs.aaai.org/index.php/AAAI/article/view/29740https://ojs.aaai.org/index.php/AAAI/article/view/29740 1.概述 首先,语…

力扣HOT100 - 142. 环形链表 II

解题思路&#xff1a; public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();while (head ! null) {if (!set.add(head)) {return head;}head head.next;}return null;} }

findImg找图工具

findImg 安装 npm install findImg -g 启动 findImg run 介绍 找出当前目录下的所有图片&#xff08;包括svg的symbol格式&#xff09;在浏览器中显示出来 源码 https://github.com/HuXin957/find-img 场景 例如前端项目中的img目录&#xff0c;大家都在往里面放图片&#xff…

k8s 控制器StatefulSet原理解析

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、k8s概述 2、有状态服务和无状态服务…

(自学用)正演理论

基于波动方程如何解决数值频散问题——快速正演方法 NAD方法&#xff1a; 怎样离散/逼近高阶偏导数&#xff08;如何采样&#xff09;&#xff1a; 传统方法是用某一点及其周围点的函数f的线性组合来逼近导数。只有函数值&#xff0c;要想提高精度&#xff0c;压制数值频散就必…

与助听器相关的职业主要有哪些?

助听装置是目前解决听觉障碍的几乎唯一科学的方法。然而助听装置改变的不是听力&#xff0c;而是外界的声音信息。也就是助听装置只能将外界的声音信息改变成能够适应听觉障碍患者听觉动态范围的声音。显然助听器并不知道听觉障碍患者的听觉动态范围是多少&#xff1f;也不知道…