ElasticSearch学习笔记(二)文档操作、RestHighLevelClient的使用
文章目录
- 前言
- 3 文档操作
- 3.1 新增文档
- 3.2 查询文档
- 3.3 修改文档
- 3.3.1 全量修改
- 3.3.2 增量修改
- 3.4 删除文档
- 4 RestAPI
- 4.1 创建数据库和表
- 4.2 创建项目
- 4.3 mapping映射分析
- 4.4 初始化客户端
- 4.5 创建索引库
- 4.6 判断索引库是否存在
- 4.7 删除索引库
- 5 RestClient操作文档
- 5.1 准备工作
- 5.2 新增文档
- 5.3 查询文档
前言
ElasticSearch学习笔记(一)倒排索引、ES和Kibana安装、索引操作
3 文档操作
3.1 新增文档
语法:
POST /{索引库名}/_doc/{文档id}
{"字段1": "值1","字段2": "值2","字段3": {"子属性1":"值3","子属性2":"值4"}// ...
}
3.2 查询文档
语法:
GET /{索引库名}/_doc/{文档id}
3.3 修改文档
3.3.1 全量修改
全量修改是覆盖原来的文档,其本质是先根据指定的id删除文档(id对应的文档不存在也可以),再新增一个相同id的文档。
语法:
PUT /{索引库名}/_doc/{文档id}
{"字段1": "值1","字段2": "值2","字段3": {"子属性1":"值3","子属性2":"值4"}// ...
}
3.3.2 增量修改
增量修改是只修改指定id匹配的文档中的部分字段。
语法:
POST /{索引库名}/_update/{文档id}
{"doc": {"修养修改的字段": "新值"}
}
3.4 删除文档
语法:
DELETE /{索引库名}/_doc/{文档id}
4 RestAPI
ES官方提供了各种不同语言的客户端用来操作ES,这些客户端的本质是组装DSL语句,通过Http请求发送给ES。其官方文档地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html
其中Java语言的客户端分为两种:
本文章学习的是high-level REST client。
4.1 创建数据库和表
CREATE DATABASE hsgx;
USE hsgx;
CREATE TABLE tb_hotel (`id` BIGINT(20) NOT NULL PRIMARY KEY COMMENT '酒店id',`name` VARCHAR(255) NOT NULL COMMENT '酒店名称',`address` VARCHAR(255) NOT NULL COMMENT '酒店地址',`price` INT(10) NOT NULL COMMENT '酒店价格',`score` INT(2) NOT NULL COMMENT '酒店评分',`brand` VARCHAR(32) NOT NULL COMMENT '酒店品牌',`city` VARCHAR(32) NOT NULL COMMENT '所在城市',`star_name` VARCHAR(16) NOT NULL COMMENT '酒店星级',`business` VARCHAR(255) NOT NULL COMMENT '商圈',`latitude` VARCHAR(32) NOT NULL COMMENT '纬度',`longitude` VARCHAR(32) NOT NULL COMMENT '经度',`pic` VARCHAR(255) DEFAULT NULL COMMENT '酒店图片'
);INSERT INTO tb_hotel(`id`, `name`, `address`, `price`, `score`, `brand`, `city`, `star_name`, `business`, `latitude`, `longitude`, `pic`)
VALUES (1, '白天鹅', '中山路', 888, 5, '白天鹅', '广州', '五星', '太古汇', '123.456', '456.748', 'a.png'),
(2, '希尔顿', '南京路', 456, 4.5, '希尔顿', '上海', '四星', '外滩', '123.456', '456.748', 'b.png');
4.2 创建项目
在IDEA中创建一个maven项目,结构如下:
4.3 mapping映射分析
mapping映射分析要考虑的信息包括:
- 字段名:参考表结构。
- 字段数据类型:参考表结构。
- 是否参与搜索:根据具体业务进行判断。
- 是否需要分词:根据具体内容进行判断,如果内容是一个整体就无需分词,反之则要分词。
- 分词器是什么:可以统一使用ik_max_word。
对应到tb_hotel
表,我们可以新建如下索引:
PUT /hotel
{"mappings": {"properties": {"id": {"type": "integer"},"name":{"type": "text","analyzer": "ik_max_word","copy_to": "all"},"address":{"type": "text","analyzer": "ik_max_word","index": false},"price":{"type": "integer"},"score":{"type": "integer"},"brand":{"type": "keyword","copy_to": "all"},"city":{"type": "keyword","copy_to": "all"},"starName":{"type": "keyword"},"business":{"type": "keyword"},"pic":{"type": "keyword","index": false},"location":{"type": "geo_point"},"all":{"type": "text","analyzer": "ik_max_word"}}}
}
其中,有两个比较特殊的字段:
- location:地理坐标,类型是
geo_point
,表示由经度(latitude)和纬度(longitude)确定一个点。 - all:一个组合字段,其目的是将多字段的值 利用
copy_to
属性合并,提供给用户搜索。在上面的例子中,name
、brand
、city
字段会合并到一起。
4.4 初始化客户端
Java客户端中,与ES一切交互都封装在一个名为RestHighLevelClient
的类中,必须先完成这个对象的初始化,建立与ES的连接。主要步骤如下:
- 1)引入依赖,注意版本号和安装的ES版本一致
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version>
</dependency>
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.12.1</version>
</dependency>
<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.12.1</version>
</dependency>
- 2)初始化RestHighLevelClient
private RestHighLevelClient client;@Before
void setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.153.128:9200")));
}@After
void close() throws IOException {this.client.close();
}
4.5 创建索引库
private static final String DSL = "{\n" +" \"mappings\": {\n" +" \"properties\": {\n" +" \"id\": {\n" +" \"type\": \"integer\"\n" +" },\n" +" \"name\":{\n" +" \"type\": \"text\",\n" +" \"analyzer\": \"ik_max_word\",\n" +" \"copy_to\": \"all\"\n" +" },\n" +" \"address\":{\n" +" \"type\": \"text\",\n" +" \"analyzer\": \"ik_max_word\",\n" +" \"index\": false\n" +" },\n" +" \"price\":{\n" +" \"type\": \"integer\"\n" +" },\n" +" \"score\":{\n" +" \"type\": \"integer\"\n" +" },\n" +" \"brand\":{\n" +" \"type\": \"keyword\",\n" +" \"copy_to\": \"all\"\n" +" },\n" +" \"city\":{\n" +" \"type\": \"keyword\",\n" +" \"copy_to\": \"all\"\n" +" },\n" +" \"starName\":{\n" +" \"type\": \"keyword\"\n" +" },\n" +" \"business\":{\n" +" \"type\": \"keyword\"\n" +" },\n" +" \"pic\":{\n" +" \"type\": \"keyword\",\n" +" \"index\": false\n" +" },\n" +" \"location\":{\n" +" \"type\": \"geo_point\"\n" +" },\n" +" \"all\":{\n" +" \"type\": \"text\",\n" +" \"analyzer\": \"ik_max_word\"\n" +" }\n" +" }\n" +" }\n" +"}";@Test
public void testCreateHotelIndex() throws IOException {// 1.参数为索引库名称CreateIndexRequest createIndexRequest = new CreateIndexRequest("hotel");// 2.设置mapping映射createIndexRequest.source(DSL, XContentType.JSON);// 3.发起创建索引库请求client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
}
由以上代码可知,创建索引库的步骤主要又三步:
- 1)创建Request对象。创建索引库的操作对应的Request对象是CreateIndexRequest。
- 2)设置mapping映射,其实就是DSL的JSON参数部分。因为JSON字符串很长,所以定义了一个静态字符串常量来表示,让代码看起来更加优雅。
- 3)发送创建索引库请求,
client.indices()
方法的返回值是IndicesClient类型,封装了所有与索引库操作有关的方法。
执行以上单元测试,在DevTools工具中查询该索引库:
4.6 判断索引库是否存在
判断索引库是否存在,本质是使用GET
命令查询索引库,因此它对应的Request对象是GetIndexRequest。
@Test
public void testExistsHotelIndex() throws IOException {// 1.参数为索引库名称GetIndexRequest request = new GetIndexRequest("hotel");// 2.发送请求boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);// 3.输出System.err.println(exists ? "索引库已经存在!" : "索引库不存在!");
}
执行以上单元测试,结果如下:
4.7 删除索引库
删除索引库对应的Request对象是DeleteIndexRequest。
@Test
public void testDeleteHotelIndex() throws IOException {// 1.参数为索引库名称DeleteIndexRequest request = new DeleteIndexRequest("hotel");// 2.发送请求client.indices().delete(request, RequestOptions.DEFAULT);
}
执行以上单元测试,在DevTools工具中查询该索引库:
5 RestClient操作文档
5.1 准备工作
由于上文定义的索引库hotel
的mapping映射与数据库表结构有一些差异,因此还需要定义一个新的实体类,与索引库的mapping映射对应起来:
@Data
@NoArgsConstructor
public class HotelDoc {private Long id;private String name;private String address;private Integer price;private Integer score;private String brand;private String city;private String starName;private String business;private String location;private String pic;public HotelDoc(Hotel hotel) {this.id = hotel.getId();this.name = hotel.getName();this.address = hotel.getAddress();this.price = hotel.getPrice();this.score = hotel.getScore();this.brand = hotel.getBrand();this.city = hotel.getCity();this.starName = hotel.getStarName();this.business = hotel.getBusiness();this.location = hotel.getLatitude() + ", " + hotel.getLongitude();this.pic = hotel.getPic();}
}
主要的区别在于,将latitude
、longitude
两个字段合并为location
一个字段。
5.2 新增文档
新增文档的DSL语句示例如下:
POST /hotel/_doc/1
{"name": "白天鹅","score": 5
}
对应的Java代码如下:
@Test
public void testCreateDocIndex() throws IOException {// 1.POST /hotel/_doc/1 { "name": "白天鹅", "score": 5 }IndexRequest request = new IndexRequest("hotel").id("1");request.source("{\"name\": \"白天鹅\", \"score\": 5}", XContentType.JSON)// 2.发送请求client.index(request, RequestOptions.DEFAULT);
}
执行以上单元测试,在DevTools工具中查询该文档:
下面实现把数据库tb_hotel
表的数据读取出来,并保存到ES中:
@Test
public void testSaveHotel() throws IOException {// 1.根据id查询酒店数据Hotel hotel = hotelService.getById(2);// 2.转换为文档类型HotelDoc hotelDoc = new HotelDoc(hotel);// 3.将HotelDoc转jsonString json = JSON.toJSONString(hotelDoc);// 4.准备Request对象IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());// 5.准备Json文档request.source(json, XContentType.JSON);// 6.发送请求client.index(request, RequestOptions.DEFAULT);
}
执行以上单元测试,在DevTools工具中查询该文档:
5.3 查询文档
新增文档的DSL语句示例如下:
GET /hotel/_doc/2
对应的Java代码如下:
@Test
public void testQueryHotelDoc() throws IOException {// 1.创建Request对象GetRequest request = new GetRequest("hotel", "2");// 2.发送请求GetResponse response = client.get(request, RequestOptions.DEFAULT);// 3.解析结果String json = response.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);System.out.println(hotelDoc);
}
执行以上单元测试,结果如下:
…
本节完,更多内容请查阅分类专栏:微服务学习笔记
感兴趣的读者还可以查阅我的另外几个专栏:
- SpringBoot源码解读与原理分析
- MyBatis3源码深度解析
- Redis从入门到精通
- MyBatisPlus详解
- SpringCloud学习笔记
相关文章:

ElasticSearch学习笔记(二)文档操作、RestHighLevelClient的使用
文章目录 前言3 文档操作3.1 新增文档3.2 查询文档3.3 修改文档3.3.1 全量修改3.3.2 增量修改 3.4 删除文档 4 RestAPI4.1 创建数据库和表4.2 创建项目4.3 mapping映射分析4.4 初始化客户端4.5 创建索引库4.6 判断索引库是否存在4.7 删除索引库 5 RestClient操作文档5.1 准备工…...

python离线安装第三方库、及其依赖库(单个安装,非批量移植)
文章目录 1.外网下载第三方库、依赖库2.内网安装第三方库3.补充附录内网中离线安装python第三方库,这时候只能去外网手动下载第三方库,再传回内网进行安装。 问题是python第三方库往往有其前置依赖包,你很难清楚某个第三方库依赖的是哪些依赖包,更难受的是依赖包可能还有其…...

昨天发的 npm 包,却因为 registry 同步问题无法安装使用
用过 HBuilderX 云打包的都知道,云上面的 Android 环境很有限,其实并不能覆盖 uniapp 生态所有的版本,甚至说只能覆盖最新的一两个版本。 如果你需要用到 HBuilderX 安卓云打包,就必须及时跟进 HBuilderX 的版本更新,…...
Redis 数据恢复及持久化策略分析
在分布式系统中,Redis作为高性能的键值存储数据库,广泛应用于缓存、会话管理、消息队列等场景。对于Redis数据的可靠性,持久化是至关重要的一环。当Redis宕机时,如何恢复数据成为一个关键问题。这篇文章将详细分析Redis的数据恢复…...
vscode 快捷键侧边栏
_____ 配置 vscode 快捷键 visual studio code - open explorer and close sidebar with the same key - Stack Overflow { "key": "ctrlshifte", // when Explorer not open // "command": "workbench.view.explorer", // either…...
FreeRTOS:1、任务通知vTaskNotifyGiveFromISR保证实时性
文章目录 背景解释意义 背景 首先,我们看以下代码: #include "FreeRTOS.h" #include "task.h"TaskHandle_t s_task_handle NULL;void vTaskFunction(void *pvParameters) {for (;;) {// 等待通知ulTaskNotifyTake(pdTRUE, portMA…...
监督学习:从数据中学习预测模型的艺术与科学
目录 引言 一、监督学习的基本概念 1、数据集 2、特征 3、标签 4、模型 二、监督学习的原理和方法 1、基本原理 2、常用方法 三、监督学习的定义与分类 1、 定义 2.、分类 四、为什么是监督学习? 1、 明确的学习目标 2、高准确率 3、易于评估 4、 …...
深入理解Java虚拟机(JVM)中的垃圾回收器
垃圾回收(Garbage Collection, GC)是现代编程语言中用于管理内存的重要机制,特别是在Java虚拟机(JVM)中。 它的基本原理是自动检测和释放不再被程序使用的内存,以避免内存泄漏和提高程序执行效率。 1.GC的基…...

视频集市新增支持多格式流媒体拉流预览
流媒体除了常用实时流外还有大部分是以文件的形式存在,做融合预览必须要考虑多种兼容性能力,借用现有的ffmpeg生态可以迅速实现多种格式的支持,现在我们将按需拉流预览功能进行了拓展,正式支持了ffmpeg的功能,可快捷方…...

定时器-前端使用定时器3s轮询状态接口,2min为接口超时
背景 众所周知,后端是处理不了复杂的任务的,所以经过人家的技术讨论之后,把业务放在前端来实现。记录一下这次的离大谱需求吧。 如图所示,这个页面有5个列表,默认加载计划列表。但是由于后端的种种原因,这…...
python实践笔记(二): 类和对象
1. 写在前面 最近在重构之前的后端代码,借着这个机会又重新补充了关于python的一些知识, 学习到了一些高效编写代码的方法和心得,比如构建大项目来讲,要明确捕捉异常机制的重要性, 学会使用try...except..finally&…...
指定GPU跑模型
加上一个CUDA_VISIBLE_DEVICES0,2就行了,使用0卡和2卡跑模型,注意多卡有时候比单卡慢,4090无NVlink,数据似乎是通过串行的方式传输到多个gpu的,只不过单个gpu是并行计算,数据在gpu与gpu之间似乎是串行传输的…...
Windows桌面运维----第五天
1、华为路由怎们配置IP、划分vlan、互通: 1、用户模式→系统模式; 2、进入相关端口,配置IP地址; 3、开通相应vlan,设置vlanX、IP地址; 4、绑定相关端口,设置端口类型; 5、电脑设置IP&#…...
bash和dash的区别(及示例)
什么是bash、dash Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等。 GNU/Linux 操作系统中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符号链接࿰…...
Java基础入门day65
day65 web项目 页面设计 仿照小米官网,将首页保存到本地为一个html页面,再将html页面保存为jsp页面,在项目中的web.xml文件中配置了欢迎页 <welcome-file-list><welcome-file>TypesServlet</welcome-file> </welcome-…...
解密制度的规定和解密工作的具体流程
解密制度是指对于某些敏感的文件或资料,经过一定的时间后,根据相关规定和程序,可以进行解密,解除文件的保密状态,使其可以被公众查阅或利用。解密制度的目的在于确保涉密信息的保密等级与其重要程度相适应,防止涉密信息的泄露和使用不当,同时促进信息公开、传播历史知识…...
实际中常用的网络相关命令
一、ping命令 ping是个使用频率极高的实用程序,主要用于确定网络的连通性。这对确定网络是否正确连接,以及网络连接的状况十分有用。 简单的说,ping就是一个测试程序,如果ping运行正确,大体上就可以排除网络访问层、网…...
机器学习补充
一、数据抽样 数据预处理阶段:对数据集进行抽样可以帮助减少数据量,加快模型训练的速度/减少计算资源的消耗,特别是当数据集非常庞大时,比如设置sample_rate0.8.平衡数据集:通过抽样平衡正负样本,提升模型…...

机器学习——RNN、LSTM
RNN 特点:输入层是层层相关联的,输入包括上一个隐藏层的输出h1和外界输入x2,然后融合一个张量,通过全连接得到h2,重复 优点:结构简单,参数总量少,在短序列任务上性能好 缺点&#x…...

Java项目学习(员工管理)
新增、员工列表、编辑员工整体代码流程与登录基本一致。 1、新增员工 RestController RequestMapping("/admin/employee")EmployeeController 类中使用了注解 RestController 用于构建 RESTful 风格的 API,其中每个方法的返回值会直接序列化为 JSON 或…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...