当前位置: 首页 > news >正文

【Elasticsearch】Springboot编写Elasticsearch的RestAPI

RestAPI

  • 初始化RestClient
  • 创建索引库
    • Mapping映射
  • 判断索引库是否存在
  • 删除索引库
  • 总结

ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。
官方文档地址
由于ES目前最新版本是8.8,提供了全新版本的客户端,老版本的客户端已经被标记为过时。而我们采用的是7.12版本,因此只能使用老版本客户端:
在这里插入图片描述
然后选择7.12版本,HighLevelRestClient版本
在这里插入图片描述

初始化RestClient

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

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

2)因为SpringBoot默认的ES版本是7.17.10,所以我们需要覆盖默认的ES版本:

  <properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><elasticsearch.version>7.12.1</elasticsearch.version></properties>

3)测试代码:

@Slf4j
@SpringBootTest
class EsClientTest {private RestHighLevelClient client;@Testvoid test() throws IOException {log.info("client = {}",client);}@BeforeEachvoid setUp() {client = new RestHighLevelClient(RestClient.builder(new HttpHost("49.233.155.186", 9200, "http")));}@AfterEachvoid tearDown() throws IOException {if (client != null) {client.close();}}
}

创建索引库

由于要实现对商品搜索,所以我们需要将商品添加到Elasticsearch中,不过需要根据搜索业务的需求来设定索引库结构,而不是一股脑的把MySQL数据写入Elasticsearch.

Mapping映射

搜索页面的效果如图所示:
实现搜索功能需要的字段包括三大部分:

  • 搜索过滤字段
    • 分类
    • 品牌
    • 价格
  • 排序字段
    • 默认:按照更新时间降序排序
    • 销量
    • 价格
  • 展示字段
    • 商品id:用于点击后跳转
    • 图片地址
    • 是否是广告推广商品
    • 名称
    • 价格
    • 评价数量
    • 销量
      对应的商品表结构如下,索引库无关字段已经划掉:
      在这里插入图片描述
      结合数据库表结构,以上字段对应的mapping映射属性如下:
字段名字段类型类型说明是否参与搜索是否参与分词分词器
idlong长整数[x][]
nametext字符串,参与分词搜索[x][x]IK
priceinteger以分为单位,所以是整数[x][]
stockinteger字符串,但需要分词[x][]
imagekeyword字符串,但是不分词[][]
categorykeyword字符串,但是不分词[x][]
brandkeyword字符串,但是不分词[x][]
soldinteger销量,整数[x][]
commentCountinteger评价,整数[][]
isADboolean布尔类型[x][]
updateTimeDate更新时间[x][]

因此,最终我们的索引库文档结构应该是这样:

PUT /items
{"mappings": {"properties": {"id": {"type": "keyword"},"name":{"type": "text","analyzer": "ik_max_word"},"price":{"type": "integer"},"stock":{"type": "integer"},"image":{"type": "keyword","index": false},"category":{"type": "keyword"},"brand":{"type": "keyword"},"sold":{"type": "integer"},"commentCount":{"type": "integer","index": false},"isAD":{"type": "boolean"},"updateTime":{"type": "date"}}}
}

创建索引
创建索引库的API如下:
在这里插入图片描述
代码分为三步:

  1. 创建Request对象。
    因为是创建索引库的操作,因此Request是CreateIndexRequest。
  2. 添加请求参数
    其实就是Json格式的Mapping映射参数。因为json字符串很长,这里是定义了静态字符串常量MAPPING_TEMPLATE,让代码看起来更加优雅。
  3. 发送请求
    client.indices()方法的返回值是IndicesClient类型,封装了所有与索引库操作有关的方法。例如创建索引、删除索引、判断索引是否存在等
    测试类中,具体代码如下:
@Test
void testCreateIndex() throws IOException {// 1.创建Request对象CreateIndexRequest request = new CreateIndexRequest("items");// 2.准备请求参数request.source(MAPPING_TEMPLATE, XContentType.JSON);// 3.发送请求client.indices().create(request, RequestOptions.DEFAULT);
}static final String MAPPING_TEMPLATE = "{\n" +"  \"mappings\": {\n" +"    \"properties\": {\n" +"      \"id\": {\n" +"        \"type\": \"keyword\"\n" +"      },\n" +"      \"name\":{\n" +"        \"type\": \"text\",\n" +"        \"analyzer\": \"ik_max_word\"\n" +"      },\n" +"      \"price\":{\n" +"        \"type\": \"integer\"\n" +"      },\n" +"      \"stock\":{\n" +"        \"type\": \"integer\"\n" +"      },\n" +"      \"image\":{\n" +"        \"type\": \"keyword\",\n" +"        \"index\": false\n" +"      },\n" +"      \"category\":{\n" +"        \"type\": \"keyword\"\n" +"      },\n" +"      \"brand\":{\n" +"        \"type\": \"keyword\"\n" +"      },\n" +"      \"sold\":{\n" +"        \"type\": \"integer\"\n" +"      },\n" +"      \"commentCount\":{\n" +"        \"type\": \"integer\"\n" +"      },\n" +"      \"isAD\":{\n" +"        \"type\": \"boolean\"\n" +"      },\n" +"      \"updateTime\":{\n" +"        \"type\": \"date\"\n" +"      }\n" +"    }\n" +"  }\n" +"}";

判断索引库是否存在

判断索引库是否存在,本质就是查询,对应的请求语句是:

GET /索引库

因此与,流程如下:

  • 1)创建Request对象。这次是GetIndexRequest对象
  • 2)准备参数。这里是无参,直接省略
  • 3)发送请求。改用exists方法
@Test
void testExistsIndex() throws IOException {// 1.创建Request对象GetIndexRequest request = new GetIndexRequest("items");// 2.发送请求boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);// 3.输出System.err.println(exists ? "索引库已经存在!" : "索引库不存在!");
}

删除索引库

删除索引库的请求非常简单:

DELETE /索引库

与创建索引库相比:

  • 请求方式从PUT变为DELTE
  • 请求路径不变
  • 无请求参数

所以代码的差异,注意体现在Request对象上。流程如下:

  • 1)创建Request对象。这次是DeleteIndexRequest对象
  • 2)准备参数。这里是无参,因此省略
  • 3)发送请求。改用delete方法

编写单元测试,实现删除索引:

@Test
void testDeleteIndex() throws IOException {// 1.创建Request对象DeleteIndexRequest request = new DeleteIndexRequest("items");// 2.发送请求client.indices().delete(request, RequestOptions.DEFAULT);
}

总结

JavaRestClient操作elasticsearch的流程基本类似。核心是client.indices()方法来获取索引库的操作对象。
索引库操作的基本步骤:

  • 初始化RestHighLevelClient
  • 创建XxxIndexRequest。XXX是Create、Get、Delete
  • 准备请求参数( Create时需要,其它是无参,可以省略)
  • 发送请求。调用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete

相关文章:

【Elasticsearch】Springboot编写Elasticsearch的RestAPI

RestAPI 初始化RestClient创建索引库Mapping映射 判断索引库是否存在删除索引库总结 ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。 官方文档地址 由于ES目前最新版本是8.8&#xff0c;提供了全…...

Python数据可视化(够用版):懂基础 + 专业的图表抛给Tableau等专业绘图工具

我先说说文章标题中的“够用版”啥意思&#xff0c;为什么这么写。 按照我个人观点&#xff0c;在使用Python进行数据分析时&#xff0c;我们有时候肯定要结合到图表去进行分析&#xff0c;去直观展现数据的规律和特定&#xff0c;那么我们肯定要做一些简单的可视化&#xff0…...

1.21学习

misc buuctf-爱因斯坦 下载附件后是一个图片&#xff0c;用stegsolve查看一下&#xff0c;各个色都没有问题&#xff0c;然后看一下数据分析&#xff0c;除此之外无其他信息&#xff0c;再看看图片属性&#xff0c;不知道是啥&#xff0c;用随波逐流进行binwalk文件提取然后得…...

SoftGNSS软件接收机源码阅读(一)程序简介、运行调试、执行流程

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、softGNSS 简介1、概述2、相关工作3、我用 softGNSS 做的事4、文件结构5、程序执行流程图 二、程序使用1、射频前端2、参数设置3、处理开源数据…...

Spring Boot AOP实现动态数据脱敏

依赖&配置 <!-- Spring Boot AOP起步依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>/*** Author: 说淑人* Date: 2025/1/18 23:03* Desc…...

Leetcode刷题-二分查找

灵神的二分视频&#xff1a;二分查找 红蓝染色法_哔哩哔哩_bilibili 34 class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:right len(nums) - 1left 0res [-1,-1]mid int((right left)/2)while right > left:if nums[mid] < …...

凭证Account Assignment的校验(FAGL_VALIDATE)

本文主要介绍在S4 HANA OP中凭证Account Assignment的校验配置。具体请参照如下内容&#xff1a; 目录 1. 定义Account Assignment校验策略(FAGL_VALIDATE) 1.1 Derivation Rule 1.2 Assignment 1.3 Initialize 1.4 Enhancement 2. 分配Account Assignment校验策略给公司…...

【20】Word:小许-质量管理-论文❗

目录 题目​ NO1.2.3.4.5 NO6.7 NO8 NO9 NO10.11 题目 NO1.2.3.4.5 另存为“Word.docx”文件在考生文件夹下&#xff0c;F12Fn是另存为的作用布局→页面设置对话框→纸张&#xff1a;大小A4→页边距&#xff1a;上下左右不连续ctrl选择除表格外的所有内容→开始→字体对…...

二十八、Qos服务质量

Qos服务质量 一、产生原因 Resources也不是万能的,使用一段时间后,资源总量可能会超过接节点配置。 根据这个情况,我们可以设置,清除资源。给pod配置,按顺序删除 二、服务质量QoS分类 Guaranteed:最高服务质量(保证),当宿主机内存不够时,会先kill掉QoS为BestEffort…...

Flutter 改完安卓 applicationId 后App 闪退问题。

一、问题 当我们项目创建完&#xff0c;想 build.gradle 改 applicationId 的时候&#xff0c;再次执行的时候可能会出现 app 闪退问题&#xff0c; 控制台不显示任何错误提示 也不出现 Exit 停止运行的情况。&#xff08;像下方这样&#xff0c; 而 app 只是在模拟器中一闪而…...

es 3期 第25节-运用Rollup减少数据存储

#### 1.Elasticsearch是数据库&#xff0c;不是普通的Java应用程序&#xff0c;传统数据库需要的硬件资源同样需要&#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库&#xff0c;不是关系型数据库&#xff0c;不具备严格的ACID事务特性&#xff…...

小菜鸟系统学习Python第三天

1.优先级问题: 结论: 幂运算>正负号>加减乘除和整除>比较运算符>逻辑运算符 2.三元运算符 3.assert断言:抛出AssertionError异常 4.for循环 4. 5.break和continue...

七.网络模型

最小(支撑)树问题 最小部分树求解&#xff1a; 破圈法&#xff1a;任取一圈&#xff0c;去掉圈中最长边&#xff0c;直到无圈&#xff1b; 加边法&#xff1a;取图G的n个孤立点&#xff5b;v1&#xff0c;v2&#xff0c;…&#xff0c; vn }作为一个支撑图&#xff0c;从最短…...

1170 Safari Park (25)

A safari park&#xff08;野生动物园&#xff09;has K species of animals, and is divided into N regions. The managers hope to spread the animals to all the regions, but not the same animals in the two neighboring regions. Of course, they also realize that t…...

数字图像处理:实验五

uu们&#xff01;大家好&#xff0c;欢迎来到数字图像处理第五章节内容的学习&#xff0c;在本章中有关空间滤波的理论学习是十分重要的&#xff0c;所以建议大家要去用心的学习本章&#xff0c;在之后的传感器的相关图像采集时&#xff0c;不可避免的会有噪声等的影响&#xf…...

2024我在csdn走过的路

自我介绍 ✏️博客名✏️&#xff1a; zy_destiny &#x1f338;粉丝数&#x1f338;&#xff1a; 1万 &#x1f33f;擅长领域&#x1f33f;&#xff1a; 人工智能 &#x1f440;欢迎访问&#x1f440;&#xff1a; 我的主页 我的2024 回顾下2024年&#xff0c;起点要从去年写…...

网络安全等级保护基本要求——等保二级

《信息安全技术网络安全等级保护基本要求》GB/T22239-2019 7.1 安全通用要求 7.1.1 安全物理环境 7.1.1.1 物理位置选择 本项要求包括&#xff1a; a) 机房场地应选择在具有防震、防风和防雨等能力的建筑内;b) 机房场地应避免设在建筑物的顶层或地下室&#xff0c;否则应加…...

了解 .mgJSON 文件

.mgJSON &#xff08;Motion Graphics JSON&#xff09;是一个基于标准 JSON 格式的文件扩展名&#xff0c;专门用于存储和交换与动态图形、动画和多媒体应用相关的数据。该格式支持静态和动态数据流&#xff0c;能够精确描述动画、物体变换、图形效果等。 .mgJSON 文件通过层级…...

django使用踩坑经历

DRF 使用drf获取序列化后的id visitor_serializer VisitorSaveSerializer(data{…}) if visitor_serializer.is_valid():visitor visitor_serializer.save() visitor_id visitor.pkpostgrepsql踩坑 django使用postgrepsql&#xff0c;使用聚合函数如:sum 等&#xff0c;被…...

【数据分享】1929-2024年全球站点的逐年最低气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff01;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站点…...

从零开始:SDXL 1.0电影级绘图工坊Docker环境搭建与测试

从零开始&#xff1a;SDXL 1.0电影级绘图工坊Docker环境搭建与测试 1. 为什么选择SDXL 1.0与Docker组合 SDXL 1.0作为Stable Diffusion系列的最新升级版本&#xff0c;在图像生成质量上实现了质的飞跃。相比前代产品&#xff0c;它原生支持1024x1024高清分辨率&#xff0c;生…...

简单理解:C++为什么要写类,我单独定义函数不可以吗?

不写类&#xff08;单独函数&#xff09; vs 写类&#xff08;装进盒子&#xff09;对比项不写类&#xff08;单独函数&#xff09;写类&#xff08;LLM 类&#xff09;代码样子String answer() {...}void save_history() {...}class LLM { String answer(); void save_history…...

Wan2.2-I2V-A14B与MATLAB联合仿真:为科学可视化生成示意图

Wan2.2-I2V-A14B与MATLAB联合仿真&#xff1a;为科学可视化生成示意图 1. 科研可视化的新选择 在科研和工程领域&#xff0c;数据可视化一直是成果展示的关键环节。传统方法往往需要研究人员手动绘制示意图&#xff0c;既耗时又难以保证一致性。最近我们尝试了一种新方法&…...

2001-2024年我国农作物分布栅格数据(小麦、玉米、水稻、甘蔗等)

1 数据介绍 中国农作物分布栅格数据集&#xff08;2001-2024&#xff09; 数据简介 本数据集由Yangyang Fu团队开发&#xff0c;提供2001-2024年中国28个省份30米分辨率的农作物分布栅格数据&#xff0c;涵盖单季稻、双季稻、冬小麦、玉米等主要作物类型及其轮作模式。 数…...

5 种简单方法,将联系人从电脑/苹果电脑传输至三星手机

如果你刚入手最新款三星 S25&#xff0c;首要任务大概率是把联系人导入新手机。由于在电脑和三星设备间传输联系人的操作稍显繁琐&#xff0c;本文将为你详细讲解如何轻松把联系人从 Windows 电脑或苹果电脑传输到三星盖乐世手机。方法一&#xff1a;通过谷歌账户将电脑联系人传…...

UnattendedWinstall隐私保护秘籍:彻底禁用Windows遥测的完整指南

UnattendedWinstall隐私保护秘籍&#xff1a;彻底禁用Windows遥测的完整指南 【免费下载链接】UnattendedWinstall Personalized Unattended Answer Files that helps automatically debloat and customize Windows 10 & 11 during the installation process. 项目地址: …...

我的第一个mdp演示

我的第一个mdp演示 【免费下载链接】mdp A command-line based markdown presentation tool. 项目地址: https://gitcode.com/gh_mirrors/md/mdp 特性列表 轻量级命令行工具支持Markdown语法代码高亮显示 运行演示&#xff1a; bash mdp demo.md常用控制键&#xff1a; …...

Vest框架企业级应用:构建可维护的大型表单验证系统

Vest框架企业级应用&#xff1a;构建可维护的大型表单验证系统 【免费下载链接】vest Vest ✅ Declarative validations framework 项目地址: https://gitcode.com/gh_mirrors/ve/vest Vest是一个声明式表单验证框架&#xff0c;专为现代Web应用设计&#xff0c;特别适合…...

Cosmos-Reason1-7B实战教程:构建具身AI测试平台的完整技术路径

Cosmos-Reason1-7B实战教程&#xff1a;构建具身AI测试平台的完整技术路径 1. 项目简介&#xff1a;一个能“看懂”物理世界的AI 想象一下&#xff0c;你给AI看一张照片&#xff0c;它不仅能告诉你“图片里有一张桌子”&#xff0c;还能分析出“桌子上的杯子快要倒了&#xf…...

Ubuntu 上安装 ComfyUI(NVIDIA GPU / Conda / CUDA 12.1)

这份教程适用于&#xff1a;UbuntuNVIDIA 显卡使用 Conda 管理环境使用 PyTorch CUDA 12.1从源码启动 ComfyUI一、准备条件开始前请确认&#xff1a;已安装 Anaconda 或 Miniconda电脑已正确安装 NVIDIA 驱动终端里执行 nvidia-smi 能看到显卡信息系统可以正常访问 GitHub二、安…...