袁庭新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();/** 初始化客户端 */@Beforepublic 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);}/** 关闭客户端 */@Afterpublic 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、指定文档IDIndexRequest 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请求并指定idGetRequest 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、指定文档IDIndexRequest 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 {// 准备删除的请求,参数为idDeleteRequest 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.mzph.cn/web/1184.shtml

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

相关文章

Golang内存、指针逃逸、垃圾回收机制概览

最近看到了一篇文章是关于go的内存、指针逃逸和垃圾回收机制的&#xff0c;发现自己并未很细致的了解过这方面的内容&#xff0c;于是在翻阅各种文章的情况下&#xff0c;写出了这篇总结&#xff0c;参考文章放在文末&#xff0c;可自取 内存 Go 语言使用一个自带的垃圾收集器…

修复vite中使用react提示Fast refresh only works when a file only exports components.

前言 我通过 vite 构建了一个 react 应用并使用 react.lazy 来懒加载组件&#xff0c;但是在使用过程中 一直提示 Fast refresh only works when a file only exports components. Move your component(s) to a separate file.eslint(react-refresh/only-export-components)。…

PSA Group EDI 需求分析

PSA集团&#xff08;以下简称PSA&#xff09;中文名为标致雪铁龙集团&#xff0c;是一家法国私营汽车制造公司&#xff0c;致力于为全球消费者提供独具特色的汽车体验和自由愉悦的出行方案&#xff0c;旗下拥有标致、雪铁龙、DS、欧宝、沃克斯豪尔五大汽车品牌。 汽车制造企业对…

动力学重构/微分方程参数拟合 - 基于模型

这一篇文章&#xff0c;主要是给非线性动力学&#xff0c;对微分方程模型参数拟合感兴趣的朋友写的。笼统的来说&#xff0c;这与混沌系统的预测有关&#xff1b;传统的机器学习的模式识别虽然也会谈论预测结果&#xff0c;但他们一般不会涉及连续的预测。这里我们考虑的是&…

Rokid AR Lite空间计算套装发布,中国空间计算踏上差异化领先之路

动动手指、动动眼睛就可以“操控一切”&#xff0c;这种颇具科幻感、未来感的交互方式&#xff0c;令许多人感叹“未来已来”。而这令人震撼的变革背后&#xff0c;正是空间计算技术的迅猛崛起与广泛应用&#xff0c;使得这种曾经只存在于想象中的交互方式&#xff0c;如今正逐…

循环神经网络(RNN):概念、挑战与应用

循环神经网络&#xff08;RNN&#xff09;&#xff1a;概念、挑战与应用 1 引言 1.1 简要回顾 RNN 在深度学习中的位置与重要性 在深度学习的壮丽图景中&#xff0c;循环神经网络&#xff08;Recurrent Neural Networks&#xff0c;RNN&#xff09;占据着不可或缺的地位。自从…

Linux 磁盘管理和文件系统

硬盘的物理结构&#xff1a; 盘片硬盘有多个盘片&#xff0c;每盘片2面磁头每面一个磁头 硬盘的数据结构&#xff1a; 扇区盘片被分为多个扇形区域&#xff0c;扇区:每个扇区存放512字节的数据&#xff0c;硬盘的最小存储单位磁道同一盘片不同半径的同心圆&#xff0c;是由磁…

软件设计师软考中项学习(二)之计算机系统基础知识

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 学习目标学习内容学习笔记学习总结 学习目标 计算机系统硬件基本组成 中央处理…

友思特应用 | 红外视角的延伸:短波红外相机的机器视觉应用

导读 短波红外SWIR在不同波段针对不同材料的独特成像特征为各领域检测应用的拓宽提供了基础。本文将展现短波红外成像技术在水分检测、塑料检测、太阳能电池板检查和矿场开采等领域的丰富应用案例&#xff0c;讨论短波红外相机在未来的发展方向。 SWIR 背景简介 短波红外 &am…

上位机图像处理和嵌入式模块部署(树莓派4b和视觉slam十四讲)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 实际使用中&#xff0c;树莓派4b是非常好的一个基础平台。本身板子价格也不是很贵&#xff0c;建议大家多多使用。之前关于vslam&#xff0c;也就是…

R语言中的execl数据转plink

文章目录 带出外部连接的方式添加列的方式从列表中选出对应的数据信息查看变量信息没有成功 带出外部连接的方式 点击这个黄色的按钮就可以弹出外部链接的方式 添加列的方式 创建一个数据框的方式 我们创建一个三行三列的数据方式 df <- data.frame(name c("Alice&…

【CSS】深入理解:BFC究竟是什么?

深入理解&#xff1a;BFC究竟是什么&#xff1f; 在我们了解BFC之前&#xff0c;我们先来看看什么是FC 1. FC的概念 FC全称 Formatting Context ,元素在标准流里面都属于一个FC 块级元素的布局都属于Block Formatting Context,也就是BFC block level box都是在BFC中布局的 …

利用AQS(AbstractQueuedSynchronizer)实现一个线程同步器

目录 1. 前言 2. 什么是同步器 3. 同步器实现思路 Semaphore(信号量) 4. 代码实现 4.1. 创建互斥锁类 4.2 编写静态内部类&#xff0c;继承AQS 4.3 内部类实现AQS钩子函数 4.3 封装lock&#xff0c;unlock方法 4.4. 测试 5. 总结 本文章源码仓库&#xff1a;Conc…

【算法刷题 | 回溯思想 06】4.17(子集、子集||)

文章目录 9.子集9.1题目9.2解法&#xff1a;回溯9.2.1回溯思路&#xff08;1&#xff09;函数返回值以及参数&#xff08;2&#xff09;终止条件&#xff08;3&#xff09;遍历过程 9.2.2代码实现 10.子集 ||10.1题目10.2解法&#xff1a;回溯10.2.1回溯思路10.2.2代码实现 9.子…

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

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

DSSAT作物模型建模方法与进阶基于Python语言快速批量运行DSSAT模型及交叉融合、扩展应用技术应用

随着数字农业和智慧农业的发展&#xff0c;基于过程的作物生长模型&#xff08;Process-based Crop Growth Simulation Model&#xff09;在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农业碳中和、农田固碳减排等领域扮演着越来越重要的作用。Decisi…

安卓官方例程

https://learn.microsoft.com/zh-cn/shows/connecton-demand/202?sourcerecommendations https://learn.microsoft.com/zh-cn/visualstudio/cross-platform/cross-platform-mobile-development-in-visual-studio?viewvs-2022 https://learn.microsoft.com/zh-cn/shows/xamari…

pta L1-063 吃鱼还是吃肉

L1-063 吃鱼还是吃肉 分数 10 全屏浏览 切换布局 作者 陈越 单位 浙江大学 国家给出了 8 岁男宝宝的标准身高为 130 厘米、标准体重为 27 公斤&#xff1b;8 岁女宝宝的标准身高为 129 厘米、标准体重为 25 公斤。 现在你要根据小宝宝的身高体重&#xff0c;给出补充营养的…

Abstract Factory抽象工厂模式详解

模式定义 提供一个创建一系列相关或互相依赖对象的接口&#xff0c;而无需指定它们具体的类。 代码示例 public class AbstractFactoryTest {public static void main(String[] args) {IDatabaseUtils iDatabaseUtils new OracleDataBaseUtils();IConnection connection …

前端页面助手 (vue)

快速开发页面&#xff08;图形化开发页面&#xff09; 自主编辑 然后自己也可以修改属性 最后导出页面即可 github地址 ;https://github.com/opentiny/tiny-engine