微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)
🔥博客主页: 【小扳_-ZEEKLOG博客】
❤感谢大家点赞👍收藏⭐评论✍

文章目录

        1.0 索引库操作

        1.1 Mapping 映射属性

        1.2 索引库的 CRUD

        1.2.1 创建索引和映射

        1.2.2 查询索引库

        1.2.3 修改索引库

        1.2.4 删除索引库

        2.0 文档操作

        2.1 新增文档

        2.2 查询文档

        2.3 删除文档

        2.4 修改文档

        2.4.1 全量修改

        2.4.2 局部修改

        2.5 批处理

        3.0 RestAPI

        3.1 初始化 RestClient

        3.2 创建索引库

        3.3 删除索引库

        3.4 判断索引库是否存在

        4.0 RestClient 操作文档

        4.1 新增文档

        4.2 查询文档

        4.3 删除文档

        4.4 修改文档

        4.5 批量导入文档


        1.0 索引库操作

        Index 就类似数据库表,Mapping 映射就类似表的结构。要向 es 中存储数据,必须先创建

Index 和 Mapping 。

        1.1 Mapping 映射属性

        Mapping 是对索引库中文档的约束,常见的 Mapping 属性包括:

type:字段数据类型,常见的简单类型有: 

        1)字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)

                数值:long、integer、short、byte、double、float

                布尔:boolean

                日期:date

                对象:object

        2)index:是否创建索引,默认为true

        3)analyzer:使用哪种分词器

        4)properties:该字段的子字段

        1.2 索引库的 CRUD

        由于 Elasticsearch 采用的是 Restful 风格的 API,因此其请求方式和路径相对都比较规范,

而且请求参数也都采用 JSON 风格。

        直接基于 Kibana 的 DevTools 来编写请求做测试,由于有语法提示,会非常方便。

      1.2.1 创建索引和映射

        基本语法:

        1)请求方式:PUT

        2)请求路径:/ 索引库名,可以自定义

        3)请求参数:mapping 映射

格式如下:

举个例子:

执行结果:

        1.2.2 查询索引库

        基本语法:

        1)请求方式:GET 

        2)请求路径:/索引库名 

        3)请求参数:无 

格式如下:

举个例子:

执行结果:

        1.2.3 修改索引库

        倒排索引结构虽然不复杂,但是一旦数据结构改变(比如改变了分词器),就需要重新创建

倒排索引,这简直是灾难。因此索引库一旦创建,无法修改 mapping。

        虽然无法修改 mapping 中已有的字段,但是却允许添加新的字段到 mapping 中,因为不会

对倒排索引产生影响。因此修改索引库能做的就是向索引库中添加新字段,或者更新索引库的基础

属性。

格式如下:

举个例子:

执行结果:

再来查询整体结构:

        1.2.4 删除索引库

        基本语法:

        1)请求方式:DELETE 

        2)请求路径:/索引库名 

        3)请求参数:无 

格式如下:

举个例子:

输出结果:

        2.0 文档操作

        有了索引库,接下来就可以向索引库中添加数据了。

        Elasticsearch 中的数据其实就是 JSON 风格的文档。操作文档自然保护增、删、改、查等

几种常见操作。

        2.1 新增文档

语法:

举个例子:

        2.2 查询文档

        根据 rest 风格,新增是 post,查询应该是 get,不过查询一般都需要条件,这里我们把文档

id 带上。

语法:

举个例子:

输出结果:

        2.3 删除文档

        删除使用 DELETE 请求,同样,需要根据 id 进行删除。

语法:

举个例子:

输出结果:

        2.4 修改文档

        修改有两种方式:

        1)全量修改:直接覆盖原来的文档。

        2)局部修改:修改文档中的部分字段。

        2.4.1 全量修改

语法:

举个例子:

输出结果:

        2.4.2 局部修改

        局部修改是只修改指定 id 匹配的文档中的部分字段。

语法:

举个例子:

查看数据:

        可以看到,只有 age 字段的信息修改了,其他字段的信息没有被修改。

        2.5 批处理

批处理采用 POST 请求,基本语法如下:

其中:

        1)index代表新增操作

                _index:指定索引库名

                _id指定要操作的文档id

                { "field1" : "value1" }:则是要新增的文档内容

        2)delete代表删除操作

                _index:指定索引库名

                _id指定要操作的文档id

        3)update代表更新操作

                _index:指定索引库名

                _id指定要操作的文档id

                { "doc" : {"field2" : "value2"} }:要更新的文档字段 

举个例子:

查看数据:

        3.0 RestAPI

        ES 官方提供了各种不同语言的客户端,用来操作 ES。这些客户端的本质就是组装 DSL 语

句,通过 http 请求发送给 ES 。

官方文档地址:Elasticsearch Clients | Elastic

        3.1 初始化 RestClient

        在 elasticsearch 提供的 API 中,与 elasticsearch 一切交互都封装在一个名为

RestHighLevelClient 的类中,必须先完成这个对象的初始化,建立与 elasticsearch 的连接。

        1)在模块中引入 es 的 RestHighLevelClient 依赖:

        注意版本为:7.12.1

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

        3)初始化 RestHighLevelClient:

代码如下:

 执行结果:

        3.2 创建索引库

创建索引库的 API 如下:

MAPPING_TEMPLATE 字符串常量:

        创建索引库中的语句:

代码分为三步:

        1)创建 Request 对象。

          因为是创建索引库的操作,因此 Request 是 CreateIndexRequest 。

        2)添加请求参数

        其实就是 Json 格式的 Mapping 映射参数。因为 json 字符串很长,这里是定义了静态字符

串常量 MAPPING_TEMPLATE,让代码看起来更加优雅。

        3)发送请求

        client.indices() 方法的返回值是 IndicesClient 类型,封装了所有与索引库操作有关的方

法。例如创建索引、删除索引、判断索引是否存在等。

        3.3 删除索引库

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

        注意体现在 Request 对象上。流程如下:

        1)创建 Request 对象。这次是 DeleteIndexRequest 对象。

        2)准备参数。这里是无参,因此省略。

        3)发送请求。改用 delete 方法。

具体代码如下:

        3.4 判断索引库是否存在

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

具体代码如下:

执行结果:

        4.0 RestClient 操作文档

        索引库准备好以后,就可以操作文档了。

        4.1 新增文档

新增文档的请求语法如下:

对应的 JavaAPI 如下:

查看结果:

可以看到与索引库操作的 API 非常类似,同样是三步走:

        1)创建 Request 对象,这里是 IndexRequest,因为添加文档就是创建倒排索引的过程。

        2)准备请求参数,本例中就是 Json 文档。

        3)发送请求。

        变化的地方在于,这里直接使用 client.xxx() 的 API,不再需要 client.indices() 了。

        4.2 查询文档

        查询的请求语句如下:

对应的 JavaAPI 如下:

执行结果:

        4.3 删除文档

        删除的请求语句如下:

对应的 JavaAPI 如下:

        4.4 修改文档

修改有两种方式: 

        1)全量修改:本质是先根据 id 删除,再新增。

        2)局部修改:修改文档中的指定字段值。

在 RestClient 的 API 中,全量修改与新增的 API 完全一致,判断依据是 ID:

        1)如果新增时,ID 已经存在,则修改。

        2)如果新增时,ID 不存在,则新增。

        这里不再赘述,主要关注局部修改的 API 即可。

具体代码如下:

执行结果:

与之前类似,也是三步走:

        1)准备 Request 对象。这次是修改,所以是 UpdateRequest 。

        2)准备参数,也就是 JSON 文档,里面包含要修改的字段。

        3)更新文档,这里调用 client.update() 方法。

        4.5 批量导入文档

        批处理与前面讲的文档的 CRUD 步骤基本一致:

        1)创建 Request,但这次用的是 BulkRequest

        2)准备请求参数

        3)发送请求,这次要用到 client.bulk() 方法

        BulkRequest 本身其实并没有请求参数,其本质就是将多个普通的 CRUD 请求组合在一起发

送。例如:

        1)批量新增文档,就是给每个文档创建一个 IndexRequest 请求,然后封装到

BulkRequest 中,一起发出。

        2)批量删除,就是创建 N 个 DeleteRequest 请求,然后封装到 BulkRequest,一起发出。

因此 BulkRequest 中提供了 add 方法,用以添加其它 CRUD 的请求:

具体代码如下:

        批量新增:

执行结果:

        id 为 "2":

        id 为 "3":

        批量删除:

具体代码如下:

执行结果:

        查询 id 为 2:

        查询 id 为 3: 

Read more

【C++藏宝阁】C++入门:命名空间(namespace)详解

【C++藏宝阁】C++入门:命名空间(namespace)详解

🌈个人主页:聆风吟 🔥系列专栏:C++藏宝阁 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 * 📚专栏订阅推荐 * 📋前言:为什么需要命名空间? * 一、命名空间的定义 * 二、命名空间的使用 * 三、命名空间的特性 * 3.1 命名空间的嵌套定义 * 3.2 命名空间的定义可以不连续 * 四、命名空间的本质:独立的作用域 * 4.1 命名空间是C++的一种作用域类型 * 4.2 命名空间作用域的特点 * 4.3 域作用限定符 `::` 的作用 * 4.4 编译器的查找规则 * 五、命名空间的价值 * 5.1 解决命名冲突 * 5.2 模块化组织代码 * 5.3

By Ne0inhk
深入理解 C++ 三大特性之一 继承

深入理解 C++ 三大特性之一 继承

欢迎来到干货小仓库!!! 今日的Commit 是明日的 Releasse,用持续交付的心态活成终身迭代的版本。 1.继承的定义 1.1定义格式 1.2继承关系和访问限定符 1.3继承基类成员访问方式的变化 类成员/继承方式public继承protected继承private继承基类的public成员派生类的public成员派生类的protected成员派生类的private成员基类的protected成员派生类的protected成员派生类的protected成员派生类的private成员基类的private成员在派生类中不可见在派生类中不可见在派生类中不可见 总结: 1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。 2. 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。3. 实际上面的表格

By Ne0inhk
【C++笔记】STL知识铺垫

【C++笔记】STL知识铺垫

前言:          在前面的学习中,我们已经掌握了C++的基础语法和编程概念,本文将深入探讨C++标准库的使用,并详细介绍迭代器、auto关键字以及范围for循环等相关知识。          一、STL简介          1.1 什么是STL          STL(Standard Template Library,标准模板库)是C++标准库的核心组成部分,它不仅提供了可复用的组件库,更是一个集成了高效数据结构与算法的软件框架。          1.2 STL的六大组件          由于历史原因,string 类型先于 STL 出现,STL 后来由惠普实验室开发并开源,因此人们通常不将 string 归入 STL 范畴。                   二、迭代器                  迭代器(Iterator)是 C++ STL 中最精妙的设计之一,如果把 STL 的容器比作各种不同类型的仓库(数组、链表、

By Ne0inhk
C++ 多态:面向对象的动态行为核心机制

C++ 多态:面向对象的动态行为核心机制

C++ 多态:面向对象的动态行为核心机制 💡 学习目标:掌握多态的概念与分类,理解虚函数的作用原理,能够熟练使用多态实现程序的动态行为扩展。 💡 学习重点:静态多态与动态多态的区别、虚函数的定义与使用、纯虚函数与抽象类、多态的实战应用场景。 一、多态的概念与分类 ✅ 结论:多态是 C++ 面向对象三大特性之一,指同一行为在不同对象上表现出不同的形态,核心是“一个接口,多种实现”。 多态主要分为两大类,二者的实现原理和触发时机截然不同: 1. 静态多态:编译阶段确定调用关系,也叫编译时多态,实现方式包括函数重载和运算符重载 2. 动态多态:运行阶段确定调用关系,也叫运行时多态,实现方式是虚函数 + 基类指针/引用 生活中的多态示例:同样是“动物叫”这个行为,猫的叫声是“喵喵喵”,狗的叫声是“汪汪汪”,不同动物对象表现出不同的行为形态。 二、静态多态:编译时确定的多态性 💡 静态多态的调用关系在编译阶段就已确定,编译器会根据参数列表的差异匹配对应的函数。

By Ne0inhk