ElasticSearch - RestClient操作ES基本操作

news2024/11/27 1:31:50

目录

什么是RestClient

hotel数据结构分析

初始化RestClient

创建索引库

删除索引库

判断索引库是否存在

小结

新增文档

查询文档

更新文档

删除文档

批量导入文档

小结


  • 什么是RestClient

  • ES官方提供了各种不同语言的客户端,用来操作ES
  • 这些客户端的本质就是组装DSL语句,通过http请求发送给ES
  • 其中的Java Rest Client又包括两种:
    • Java Low Level Rest Client
    • Java High Level Rest Client
  • 我们学习的是Java HighLevel Rest Client客户端API
  • hotel数据结构分析

  • mapping映射分析

  • 创建索引库,最关键的是mapping映射,而mapping映射要考虑的信息包括:
    • 字段名
    • 字段数据类型
    • 是否参与搜索
    • 是否需要分词
    • 如果分词,分词器是什么?
  • 其中:
    • 字段名、字段数据类型,可以参考数据表结构的名称和类型
    • 是否参与搜索要分析业务来判断,例如图片地址,就无需参与搜索
    • 是否分词呢要看内容,内容如果是一个整体就无需分词,反之则要分词
    • 分词器,我们可以统一使用ik_max_word
  • 以此推出索引库结构
  • 几个特殊字段说明:
    • location:地理坐标,里面包含精度、纬度
    • all:一个组合字段,其目的是将多字段的值 利用copy_to合并,提供给用户搜索
  • 地理坐标说明
  • ES中支持两种地理坐标数据类型:
    • geo_point:由纬度(latitude)和经度(longitude)确定的一个点;例如:"32.8752345,120.2981576"
    • geo_shape:有多个geo_point组成的复杂几何图形;例如一条直线,"LINESTRING (-77.03653 38.897676,-77.009051 38.889939)"
  • copy_to说明

  • 初始化RestClient

  • 在elasticsearch提供的API中
  • 与elasticsearch一切交互都封装在一个名为RestHighLevelClient的类中
  • 必须先完成这个对象的初始化,建立与elasticsearch的连接
  • 步骤1:引入es的RestHighLevelClient依赖

  • 步骤2:因为SpringBoot默认的ES版本是7.6.2,所以我们需要覆盖默认的ES版本

  • 步骤3:初始化RestHighLevelClient
  • 创建索引库

  • 整体分为三步:
    • (1)创建Request对象;因为是创建索引库的操作,因此Request是CreateIndexRequest
    • (2)添加请求参数,其实就是DSL的JSON参数部分;因为json字符串很长,这里是定义了静态字符串常量MAPPING_TEMPLATE,让代码看起来更加优雅
    • (3)发送请求,client.indices()方法的返回值是IndicesClient类型,封装了所有与索引库操作有关的方法
  • 具体实例
  • (1)创建一个类,定义mapping映射的JSON字符串常量
  • (2)在HotelIndexTest测试类中,编写单元测试,实现创建索引:
  • 删除索引库

  • 删除索引库的DSL语句
  • DELETE /索引库名
  • 与创建索引库相比:
    • 请求方式从PUT变为DELTE
    • 请求路径不变
    • 无请求参数
  • 所以代码的差异,主要体现在Request对象上;依然是三步走:
    • (1)创建Request对象;这次是DeleteIndexRequest对象
    • (2)准备参数;这里是无参
    • (3)发送请求;改用delete方法
  • 在HotelIndexTest测试类中,编写单元测试,实现删除索引
  • 判断索引库是否存在

  • 判断索引库是否存在,本质就是查询
  • 对应的DSL:
  • GET /索引库名
  • 因此与删除的Java代码流程是类似的
  • 依然是三步走:
    • (1)创建Request对象;这次是GetIndexRequest对象
    • (2)准备参数;这里是无参
    • (3)发送请求;改用exists方法
  • 在HotelIndexTest测试类中,编写单元测试,实现判断索引
  • 小结

  • JavaRestClient操作elasticsearch的流程基本类似
  • 核心是client.indices()方法来获取索引库的操作对象
  • 索引库操作的基本步骤:
    • 初始化RestHighLevelClient
    • 创建XxxIndexRequest;XXX是Create、Get、Delete
    • 准备DSL(Create时需要,其它是无参)
    • 发送请求;调用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete
  • 新增文档

  • 要将数据库的酒店数据查询出来,导入到hotel索引库,实现酒店数据的CRUD
  • 索引库实体类
  • 数据库查询后的结果是一个Hotel类型的对象;但需要转变,结构如下:
  • 与我们的索引库结构存在差异:
    • longitude和latitude需要合并为location
    • 因此,需要定义一个新的类型,与索引库结构吻合
  • 新增文档的DSL语句
    • POST /{索引库名}/_doc/1
    • {
    • "name": "Jack",
    • "age": 21
    • }
  • 可以看到与创建索引库类似,同样是三步走
    • (1)创建Request对象
    • (2)准备请求参数,也就是DSL中的JSON文档
    • (3)发送请求
  • 变化的地方在于,这里直接使用client.xxx()的API,不再需要client.indices()了
  • 导入酒店数据,基本流程一致,但是需要考虑几点变化:
    • 酒店数据来自于数据库,我们需要先查询出来,得到hotel对象
    • Hotel对象需要转为HotelDoc对象
    • HotelDoc需要序列化为json格式
  • 在HotelDocumentTest测试类中,编写单元测试
  • 查询文档

  • 查询的DSL语句
    • GET /hotel/_doc/{id}
  • 代码大概分两步
    • 准备Request对象
    • 发送请求
  • 不过查询的目的是得到结果,解析为HotelDoc,因此难点是结果的解析
  • 结果是一个JSON
  • 其中文档放在一个_source属性中,因此解析就是拿到_source,反序列化为Java对象即可
  • 与之前类似,也是三步走:
    • (1)准备Request对象;这次是查询,所以是GetRequest
    • (2)发送请求,得到结果。因为是查询,这里调用client.get()方法
    • (3)解析结果,就是对JSON做反序列化
  • 在HotelDocumentTest测试类中,编写单元测试
  • 更新文档

  • 修改之前讲过两种方式:
    • 全量修改:本质是先根据id删除,再新增
    • 增量修改:修改文档中的指定字段值
  • 在RestClient的API中,全量修改与新增的API完全一致,判断依据是ID:
    • 如果新增时,ID已经存在,则修改
    • 如果新增时,ID不存在,则新增
  • 与之前类似,也是三步走:
    • (1)准备Request对象;这次是修改,所以是UpdateRequest
    • (2)准备参数;也就是JSON文档,里面包含要修改的字段
    • (3)更新文档;这里调用client.update()方法
  • 在HotelDocumentTest测试类中,编写单元测试
  • 删除文档

  • 删除的DSL为
    • DELETE /hotel/_doc/{id}
  • 与查询相比,仅仅是请求方式从GET变成DELETE,可以想象Java代码应该依然是三步走
    • (1)准备Request对象,因为是删除,这次是DeleteRequest对象;要指定索引库名和id
    • (2)准备参数,无参
    • (3)发送请求;因为是删除,所以是client.delete()方法
  • 编写单元测试
  • 批量导入文档

  • 利用BulkRequest批量将数据库数据导入到索引库中
  • 步骤如下:
    • 利用mybatis-plus查询酒店数据
    • 将查询到的酒店数据(Hotel)转换为文档类型数据(HotelDoc)
    • 利用JavaRestClient中的BulkRequest批处理,实现批量新增文档
  • 批量处理BulkRequest
    • 其本质就是将多个普通的CRUD请求组合在一起发送
    • 其中提供了一个add方法,用来添加其他请求

  • 可以看到,能添加的请求包括:
    • IndexRequest,也就是新增
    • UpdateRequest,也就是修改
    • DeleteRequest,也就是删除
  • 因此Bulk中添加了多个IndexRequest,就是批量新增功能了
  • 其实还是三步走:
    • (1)创建Request对象;这里是BulkRequest
    • (2)准备参数;批处理的参数,就是其它Request对象,这里就是多个IndexRequest
    • (3)发起请求;这里是批处理,调用的方法为client.bulk()方法
  • 在导入酒店数据时,将上述代码改造成for循环处理即可
  • 在HotelDocumentTest测试类中,编写单元测试
  • 小结

  • 文档操作的基本步骤:
    • 初始化RestHighLevelClient
    • 创建XxxRequest;XXX是Index、Get、Update、Delete、Bulk
    • 准备参数(Index、Update、Bulk时需要)
    • 发送请求;调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete、bulk
    • 解析结果(Get时需要)

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

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

相关文章

Java基础语法——方法

目录 方法概述 方法定义及格式 方法重载 •方法重载概述 •方法重载特点 方法中基本数据类型和引用数据类型的传递 方法概述 ——假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹(植物大战僵尸)。发射炮弹的动作需要编写100行的代码&…

五、在测试集上评估图像分类算法精度(Datawhale组队学习)

文章目录配置环境准备图像分类数据集和模型文件测试集图像分类预测结果表格A-测试集图像路径及标注表格B-测试集每张图像的图像分类预测结果,以及各类别置信度可视化测试集中被误判的图像测试集总体准确率评估指标常见评估指标混淆矩阵PR曲线绘制某一类别的PR曲线绘…

密码学的100个基本概念

密码学的100个基本概念一、密码学历史二、密码学基础三、分组密码四、序列密码五、哈希函数六、公钥密码七、数字签名八、密码协议九、密钥管理十、量子密码2022年主要完成了密码学专栏的编写,较为系统的介绍了从传统密码到现代密码,以及量子密码的相关概…

C语言函数声明以及函数原型

C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错。但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明。所谓声明(Declaration),就是告诉编译器…

《网络编程实战》学习笔记 Day9

系列文章目录 这是本周期内系列打卡文章的所有文章的目录 《Go 并发数据结构和算法实践》学习笔记 Day 1《Go 并发数据结构和算法实践》学习笔记 Day 2《说透芯片》学习笔记 Day 3《深入浅出计算机组成原理》学习笔记 Day 4《编程高手必学的内存知识》学习笔记 Day 5NUMA内存知…

【论文翻译】Non-local Neural Networks

摘要 卷积运算和循环运算都是每次处理一个局部邻域的构建块。在本文中,我们将非局部操作作为一组用于捕获长期依赖关系的构建块。受计算机视觉中经典的非局部均值方法[4]的启发,我们的非局部运算将一个位置的响应计算为所有位置特征的加权和。这个构建块…

「自控原理」5.2 频域稳定判据、频域分析

本节介绍奈奎斯特稳定判据、对数稳定判据,并引入稳定裕度 本节介绍频率特性法分析系统性能 本节介绍通过开环频率特性得到闭环频率特性的方法 文章目录频域稳定判据奈奎斯特稳定判据ZP−2NZP-2NZP−2N奈奎斯特稳定判据的推导对数稳定判据容易判断出错的情况临界稳定…

第九层(4):STL之duque类

文章目录前情回顾deque类deque类的功能deque和vector的区别deque容器的内部图deque类内的构造函数deque类内的赋值操作deque类内的大小操作deque类内的插入操作deque类内的删除操作deque类内的单个访问下一座石碑🎉welcome🎉 ✒️博主介绍:一…

设计模式 - 创建型模式_原型模式

文章目录创建型模式概述Case场景模拟⼯程Bad ImplBetter Impl (原型模式重构代码)创建型模式 创建型模式提供创建对象的机制, 能够提升已有代码的灵活性和可复⽤性。 类型实现要点工厂方法定义⼀个创建对象的接⼝,让其⼦类⾃⼰决…

AcWing蓝桥杯AB组辅导课08、数论

文章目录前言一、数论例题例题1:AcWing 1246. 等差数列(最大公约数,第十届蓝桥杯省赛CB第7题)分析题解:最大公约数例题2:AcWing 1295. X的因子链(算数基本定理、欧拉筛选,多重集合排…

打工人必知必会(四)——股票期权属于劳动争议吗

目录 参考 一、核心概览 二、 注意 三、更多案例 参考 案例评析:股票期权纠纷是否属于劳动争议 股票期权(限制性股票)相关劳动争议问题 北上广深杭案例 一、核心概览 二、 注意 结合双方股权激励协议的签署背景、目的等因素来综合考量并作出相对准…

【数据结构】8.1 排序概述

文章目录排序的基本概念排序方法的分类存储结构排序的基本概念 什么是排序? 排序:将一组杂乱无章的数据按照一定规律顺次排列起来。 即,讲无序序列排成一个有序序列(有小到大或由大到小)的运算。 如果参加排序的数据…

MicroPython开发ESP8266——环境搭建

MicroPython开发ESP8266——环境搭建0.前言一、固件烧写1.使用乐鑫官方的烧写工具2.使用python中的esptool工具烧写3.使用uPyCraft烧写4.测试二、IDE工具安装1.windows环境搭建2.Linux环境搭建3.测试1)软件设置2)测试程序3)烧录0.前言 最近刷…

NLP 语种检测 API 数据接口

NLP 语种检测 API 数据接口 180 语言检测,语种全称与缩写,返回置信度。 1. 产品功能 基于 NLP 分析文本的语种支持 180 多语种检测;语种缩写遵循 ISO 639-1 标准;包含检测到的语种置信度;毫秒级响应性能;…

Java 代码ccflow 代码分析

流程属性目录概述需求:设计思路实现思路分析1。代码流程参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. ha…

Linux中详解编译原理每一步

引言: 时间过的飞快,可以看出我们已经开始学习Linux了,但是我们学习Linux过程中,依然会涉及到很多的以前的知识,比如编译原理,我们的代码如何从一个源文件逐步变成一个可执行文件,当初我记得我…

流批一体计算引擎-8-[Flink]的Table API连接器

参考官方文档Table API连接器 1 Table API连接器概述 Flink的Table API和SQL程序可以连接到其他外部系统,用于读取和写入批处理表和流式表。source表提供对存储在外部系统(如数据库、键值存储、消息队列或文件系统)中的数据的访问。sink表将…

Sentienl学习笔记

PS:本文为作者学习黑马程序员Springcould视频笔记实际技术参考价值不大,文章将持续更新。 文章目录一. 什么是Sentienl1. 介绍2. 与Hystrix对比3. 主要特性二. Sentienl安装配置1. 下载安装包2. 启动三. Sentienl的使用1. Sentienl的整合2. 簇点链路四. …

每日学术速递1.27

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 前沿推介: ICLR 2023 ICLR 全称为国际学习表征会议(International Conference on Learning Representations),今年将举办的是第 11 届,预计将于 5 月 1 日至 5 …

Redis实现附近商铺 | 黑马点评

一、GEO数据结构 1、入门 GEO是Geolocation的缩写,代表地理坐标。redis3.2中加入对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。 常见命令: GEOADD:添加一个地理空间信息,包含&…