详解SpringCloud微服务技术栈:ElasticSearch实践1——RestClient操作索引库与文档

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习
🌌上期文章:详解SpringCloud微服务技术栈:ElasticSearch原理精讲、安装、实践
📚订阅专栏:微服务技术全家桶
希望文章对你们有所帮助

在前面已经学习了如何使用DSL语句去操作ElasticSearch的索引库和文档,现在需要用ES官方提供的RestClient,这个客户端本质就是组装DSL语句,通过http请求发送给ES,从而方便我们使用Java代码进行操作。

ElasticSearch实战1——RestClient操作索引库与文档

  • 导入demo
  • hotel数据结构分析
  • RestClient操作索引库
    • 初始化RestClient
    • 创建索引库
    • 删除和判断索引库
  • RestClient操作文档
    • 新增文档
    • 查询文档
    • 更新文档
    • 删除文档
    • 批量导入文档

导入demo

sql文件和项目工程从网盘下,自行导入:

链接:https://pan.baidu.com/s/1CDgGJGvpSu0-s6bFfLWvVA?pwd=nrx2
提取码:nrx2

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

hotel数据结构分析

mapping映射要考虑的问题:字段名、数据类型、是否参与搜索、是否分词、若分词,分词器选什么?
所以,我们需要针对数据库的字段来做mapping映射:
在这里插入图片描述
这里面的信息在做mapping的时候,主要是要会选择是否要参与搜索、是否分词,这需要根据业务需求来实现,比如用户找酒店的时候肯定不会是搜索酒店的地址,因此酒店地址不应该加入搜索,也不应该分词。

需要注意的是,ES中对地理坐标的描述,并不是字符串也不是数字,它支持了2种坐标数据类型:

geo_point:由维度latitude和精度longitude确定的一个点
geo_shape:有多个geo_point组成的复杂几何图形

容易发现,里面有很多字段存在ES中,将来都要参与搜索,也就意味着当用户输入某个字段的时候需要根据这多个字段来搜,效率肯定不高。
而ES提供了一个功能,能够实现多字段搜索同时效率还高的,即字段拷贝。也就是使用copy_to属性将当前字段拷贝到指定字段,示例:

"all":{"type": "text","analyzer": "ik_max_word"
}
"brand":{"type": "keyword","copy_to": "all"
}

这样我们就可以把需要搜索的字段全部联合到all里面,即可实现用户输入一个信息,多字段搜索,且效率是会大大提高的。
因此在dev tools中编写DSL代码:

# 酒店索引库及mapping映射
PUT /hotel
{"mapping": {"properties": {"id":{"type": "keyword"},"name":{"type": "text","analyzer": "ik_max_word","copy_to": "all"},"address":{"type": "keyword","index": false},"price":{"type": "integer"},"score":{"type": "integer"},"brand":{"type": "keyword","copy_to": "all"},"city":{"type": "keyword"},"startName":{"type": "keyword"},"business":{"type": "keyword","copy_to": "all"},"location":{"type": "geo_point"},"pic":{"type": "keyword","index": false},"all":{"type": "text","analyzer": "ik_max_word"}}}
}

上面代码没有正式执行,用来做个基础样式,最终创建索引库还是要用ES的java客户端来实现,方便之后简化开发。

RestClient操作索引库

初始化RestClient

1、引入ES的RestHighLevelClient依赖:

	<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version></dependency>

2、SpringBoot默认的ES版本是7.6.2,因此需要覆盖:
在这里插入图片描述

3、初始化RestHighLevelClient:

public class HotelIndexTest {private RestHighLevelClient client;@Testvoid testInit() {System.out.println(client);}@BeforeEach //提前完成RestHighLevelClient对象的初始化void setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.177.130:9200")));}@AfterEach //结束后要销毁这个初始化void tearDown() throws IOException {this.client.close();}
}

创建索引库

结合DSL语句会比较好看懂,代码如下:

	@Testvoid createHotelIndex() throws IOException {//创建request对象CreateIndexRequest request = new CreateIndexRequest("hotel");//准备请求的参数,为JSON格式request.source(MAPPING_TEMPLATE, XContentType.JSON);//发送请求,indices为index复数,可以获得操作索引库的所有对象,默认方式发送client.indices().create(request, RequestOptions.DEFAULT);}

其中MAPPING_TEMPLATE就是之前的DSL语句,复制过来当作静态常量来存储:
在这里插入图片描述

在DEV TOOLS中输入GET /hotel即可查看是否成功创建:
在这里插入图片描述

删除和判断索引库

其实这个可以自行的去做,也挺容易实现的,毕竟indices已经将所有操作索引库的api都封装好了,按Ctrl+Shift+空格即可查看所有方法。
删除索引库:

	@Testvoid testDeleteIndex() throws IOException {DeleteIndexRequest request = new DeleteIndexRequest("hotel");client.indices().delete(request, RequestOptions.DEFAULT);}

判断索引库是否存在:

	@Testvoid testExistsHotelIndex() throws IOException {GetIndexRequest request = new GetIndexRequest("hotel");boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);System.out.println(exists ? "存在" : "不存在");}

RestClient操作文档

写一个小demo,去数据库中查询酒店数据,导入到hotel索引库,从而实现酒店数据的CRUD。
需要先进行JavaRestClient的初始化,在之前有代码了,直接CV一下。
而对于文档的操作,不再需要indices了。

新增文档

这里需要用的方法是index,表示新增文档时候创建倒排索引。

	private RestHighLevelClient client;@Resourceprivate IHotelService hotelService;@Testvoid testAddDocument() throws IOException {//根据id查询酒店Hotel hotel = hotelService.getById(61083L);/*** Hotel对象中的地理位置是分为经度和纬度分别来存的,但是ES中是用geo_point来存的* 因此需要先转换为文档类型HotelDoc*/HotelDoc hotelDoc = new HotelDoc(hotel);//准备request对象IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());//准备JSON文档,传进去的需要是JSON格式的字符串request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);//发送请求client.index(request, RequestOptions.DEFAULT);}

在这里插入图片描述

查询文档

根据id查询到的文档数据是JSON,需要反序列化为java对象:

@Testvoid testGetDocumentById() throws IOException {GetRequest request = new GetRequest("hotel", "61083");GetResponse response = client.get(request, RequestOptions.DEFAULT);//source里面是这个hotel的相关数据String json = response.getSourceAsString();//将json反序列化为java对象HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);System.out.println("hotelDoc = " + hotelDoc);}

在这里插入图片描述

更新文档

之前讲解了全量更新和局部更新,这里只演示局部更新:

	@Testvoid testUpdateDocument() throws IOException {UpdateRequest request = new UpdateRequest("hotel", "61083");request.doc("price", "952","starName", "四钻");client.update(request, RequestOptions.DEFAULT);}

删除文档

	@Testvoid testDeleteDocument() throws IOException {DeleteRequest request = new DeleteRequest("hotel", "61083");client.delete(request, RequestOptions.DEFAULT);}

再次查询,返回null:
在这里插入图片描述

批量导入文档

之前的新增,都是一次就新增一条数据,现在利用JavaRestClient批量导入酒店数据到ES中。

思路:
1、利用mybatis-plus查询酒店数据
2、将查询到的酒店数据(Hotel)转换为文档类型数据(HotelDoc)
3、利用JavaRestClient中的Bulk批处理,实现批量新增文档

	@Testvoid testBulkRequest() throws IOException {//批量查询酒店数据List<Hotel> hotels = hotelService.list();//创建requestBulkRequest request = new BulkRequest();//将hotels转换成HotelDocfor (Hotel hotel : hotels) {HotelDoc hotelDoc = new HotelDoc(hotel);//准备参数,添加多个新增的requestrequest.add(new IndexRequest("hotel").id(hotelDoc.getId().toString()).source(JSON.toJSONString(hotelDoc), XContentType.JSON));}//发送请求client.bulk(request, RequestOptions.DEFAULT);}

在dev tools使用GET /hotel/_search进行批量查询:
在这里插入图片描述

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

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

相关文章

【Tailwind】各种样式的进度条

基本样式进度条&#xff1a; <div class"mb-5 h-2 rounded-full bg-gray-200"><div class"h-2 rounded-full bg-orange-500" style"width: 50%"></div> </div>带文字的进度条&#xff1a; <div class"relativ…

npm install报错certificate has expired

报错&#xff1a; reason: certificate has expired 解决&#xff1a;更换npm镜像源 登录到服务器上&#xff0c;更换npm镜像源(或者在jenkins上配置) npm config set registry http://registry.cnpmjs.org npm config set registry http://registry.npm.taobao.org #如果上面…

人工智能时代:让AIGC成为你的外部智慧源(文末送书)

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 什么是AIGC?二. AIGC如何运作&#xff1f;2.1 步骤一&#xff1a;收集数据2.…

postgresql12表膨胀解决(不锁表)

查看所有数据库占用磁盘空间 SELECTpg_database.datname AS "数据库名称",pg_size_pretty(pg_database_size(pg_database.datname)) AS "磁盘占用空间" FROMpg_database;发现有个数据库占用空间过大 查询库中所有表占用空间 SELECTtable_name,pg_size_…

Lucene 源码分析——BKD-Tree

Lucene 源码分析——BKD-Tree - AIQ Bkd-Tree Bkd-Tree作为一种基于K-D-B-tree的索引结构&#xff0c;用来对多维度的点数据(multi-dimensional point data)集进行索引。Bkd-Tree跟K-D-B-tree的理论部分在本篇文章中不详细介绍&#xff0c;对应的两篇论文在附件中&#xff0c…

【LangChain学习之旅】—(9) 用SequencialChain链接不同的组件

【LangChain学习之旅】—&#xff08;9&#xff09;用SequencialChain链接不同的组件 什么是 ChainLLMChain&#xff1a;最简单的链链的调用方式直接调用通过 run 方法通过 predict 方法通过 apply 方法通过 generate 方法 Sequential Chain&#xff1a;顺序链首先&#xff0c;…

Oracle篇—分区表的管理(第二篇,总共五篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

day2C++

思维导图 Rect类 #include <iostream>using namespace std;class my_Rect { private:int width;int height;public://初始化void init(){cout << "please ener w and h" << endl;cin >> width;cin >> height;cout << "suc…

Linux入门攻坚——14、实战软件安装-搭建Python3.8环境-2

上一篇解决了openssl和pip问题&#xff0c;这一篇来解决sqlite问题 创建app时出现错误&#xff0c;模块_sqlite3找不到&#xff0c;查询sqlite相关的包&#xff1a; 在python2.6的lib-dynload路径下&#xff0c;有_sqlite3.so&#xff0c;这个应该就是Python需要的sqlite模块&a…

磺化 Cy5 溶菌酶,Sulfo-Cyanine5-Lysozyme,用于标记生物分子和细胞结构

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;磺化 Cy5 溶菌酶&#xff0c;Sulfo-Cyanine5-Lysozyme&#xff0c;Sulfo Cy5 Lysozyme 一、基本信息 产品简介&#xff1a;Sulfo Cyanine5 Lysozyme, also known as sulfonated Cy5 lysozyme, is a fluorescent mar…

ASP.NET Core WebAPI从HTTPS调整为HTTP启动

使用VS2022创建WebAPI项目时&#xff0c;默认勾选“配置HTTPS(H)”&#xff0c;这样启动WebAPI时以https方式启动。   如果要从HTTPS调整为HTTP启动&#xff0c;需要修改项目中以下几处&#xff0c;首先是Program.cs中删除app.UseHttpsRedirection()语句&#xff0c;删除后…

【Unity】粒子贴图异常白边问题

从PS制作的黑底&#xff0c;白光的贴图。放入Unity粒子中&#xff0c;拉远看会有很严重的白边&#xff0c;像马赛克一样。 材质使用&#xff1a;Mobile/Particles/Additive 经测试只使用一张黑色的图片&#xff0c;也会有白边。 解决方案&#xff1a; 关闭黑色底&#xf…

php基础学习之整型进制

不同进制的整型数据定义 在 PHP中提供了四种整型的定义方式&#xff1a;十进制定义&#xff0c;二进制定义&#xff0c;八进制定义和十六进制。 定义格式如下&#xff1a; 十进制是最基础的&#xff1a;$a 110;二进制需要在值前面加上0b&#xff1a;$a 0B1101110;&#xf…

arcgis 面要素shp数据处理

面要素是工作中用到最多的&#xff0c;那么面要素是如何形成的呢&#xff0c;主要还是由闭合的线要素转换而成。在面要素数据中常用的有以下几点&#xff1a; 一、 线转面&#xff08;要素转面&#xff09; 通过上一篇得到了点转线的要素&#xff0c;那么根据上节的线要素&am…

Sqlite真空命令VACUUM

之前在项目中使用了sqlite数据库&#xff0c;当日志变大时&#xff0c;执行CRUD操作就会变慢 后来尝试删除7天前的记录进行优化 delete from XX_CollectData where CreateTime<2024-01-24 发现sqlite文件的大小就没有变化&#xff0c;delete命令只是逻辑删除&#xff0c;…

BPM、低代码和人工智能:实现灵活、创新与转型的关键结合

随着零售业格局的不断演变&#xff0c;零售商正被迫在一个日益活跃、竞争日益激烈的客户驱动型市场中展开竞争。随着互联网上产品信息和评论的出现&#xff0c;消费者的态度发生了巨大的变化——购物者不再依赖销售人员来获取信息。他们现在知道的和许多零售销售人员一样多&…

Element-Plus如何实现表单校验和表单重置

一&#xff1a;页面布局介绍&#xff1a; 这是我刚刚用基于vue3element-plus写好的一个部门管理的页面 基本的增删改查已经写好&#xff0c;下面我只提供页面的template和style的代码&#xff1a; template <template><el-card class"box-card"><…

openGauss学习笔记-207 openGauss 数据库运维-常见故障定位案例-btree 索引故障情况下应对策略

文章目录 openGauss学习笔记-207 openGauss 数据库运维-常见故障定位案例-btree 索引故障情况下应对策略207.1 btree 索引故障情况下应对策略207.1.1 问题现象207.1.2 原因分析207.1.3 处理办法 openGauss学习笔记-207 openGauss 数据库运维-常见故障定位案例-btree 索引故障情…

洛谷P5735 【深基7.例1】距离函数(C语言)

首先&#xff0c;三角形周长为 其次(x1,x2)和 &#xff08;y1,y2&#xff09;的距离 然后就可以为所欲为 #include <stdio.h> #include <math.h>double distance(double a1, double b1, double a2, double b2) {return sqrt((a1 - a2) * (a1 - a2) (b1 - b2) * …

【跳槽面试】Redis的过期键删除策略?

前言 key的生存时间到了&#xff0c;Redis会立即删除吗&#xff1f;不会立即删除。 过期策略 • 定时删除&#xff1a;在设置key的过期时间的同时&#xff0c;为该key创建一个定时器&#xff0c;让定时器在key的过期时间来临时&#xff0c;对key进行删除 • 定期删除&#xff…