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


文章目录
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: