目录
什么是RestClient
hotel数据结构分析
初始化RestClient
创建索引库
删除索引库
判断索引库是否存在
小结
新增文档
查询文档
更新文档
删除文档
批量导入文档
小结
-
什么是RestClient
- ES官方提供了各种不同语言的客户端,用来操作ES
- 这些客户端的本质就是组装DSL语句,通过http请求发送给ES
- 其中的Java Rest Client又包括两种:
- Java Low Level Rest Client
- Java High Level Rest Client
- 我们学习的是Java HighLevel Rest Client客户端API
-
hotel数据结构分析
- mapping映射分析
- 创建索引库,最关键的是mapping映射,而mapping映射要考虑的信息包括:
- 字段名
- 字段数据类型
- 是否参与搜索
- 是否需要分词
- 如果分词,分词器是什么?
- 其中:
- 字段名、字段数据类型,可以参考数据表结构的名称和类型
- 是否参与搜索要分析业务来判断,例如图片地址,就无需参与搜索
- 是否分词呢要看内容,内容如果是一个整体就无需分词,反之则要分词
- 分词器,我们可以统一使用ik_max_word
- 以此推出索引库结构
- 几个特殊字段说明:
- location:地理坐标,里面包含精度、纬度
- all:一个组合字段,其目的是将多字段的值 利用copy_to合并,提供给用户搜索
- 地理坐标说明
- ES中支持两种地理坐标数据类型:
- geo_point:由纬度(latitude)和经度(longitude)确定的一个点;例如:"32.8752345,120.2981576"
- geo_shape:有多个geo_point组成的复杂几何图形;例如一条直线,"LINESTRING (-77.03653 38.897676,-77.009051 38.889939)"
- copy_to说明
-
初始化RestClient
- 在elasticsearch提供的API中
- 与elasticsearch一切交互都封装在一个名为RestHighLevelClient的类中
- 必须先完成这个对象的初始化,建立与elasticsearch的连接
- 步骤1:引入es的RestHighLevelClient依赖
- 步骤2:因为SpringBoot默认的ES版本是7.6.2,所以我们需要覆盖默认的ES版本
- 步骤3:初始化RestHighLevelClient
-
创建索引库
- 整体分为三步:
- (1)创建Request对象;因为是创建索引库的操作,因此Request是CreateIndexRequest
- (2)添加请求参数,其实就是DSL的JSON参数部分;因为json字符串很长,这里是定义了静态字符串常量MAPPING_TEMPLATE,让代码看起来更加优雅
- (3)发送请求,client.indices()方法的返回值是IndicesClient类型,封装了所有与索引库操作有关的方法
- 具体实例
- (1)创建一个类,定义mapping映射的JSON字符串常量
- (2)在HotelIndexTest测试类中,编写单元测试,实现创建索引:
-
删除索引库
- 删除索引库的DSL语句
- DELETE /索引库名
- 与创建索引库相比:
- 请求方式从PUT变为DELTE
- 请求路径不变
- 无请求参数
- 所以代码的差异,主要体现在Request对象上;依然是三步走:
- (1)创建Request对象;这次是DeleteIndexRequest对象
- (2)准备参数;这里是无参
- (3)发送请求;改用delete方法
- 在HotelIndexTest测试类中,编写单元测试,实现删除索引
-
判断索引库是否存在
- 判断索引库是否存在,本质就是查询
- 对应的DSL:
- GET /索引库名
- 因此与删除的Java代码流程是类似的
- 依然是三步走:
- (1)创建Request对象;这次是GetIndexRequest对象
- (2)准备参数;这里是无参
- (3)发送请求;改用exists方法
- 在HotelIndexTest测试类中,编写单元测试,实现判断索引
-
小结
- JavaRestClient操作elasticsearch的流程基本类似
- 核心是client.indices()方法来获取索引库的操作对象
- 索引库操作的基本步骤:
- 初始化RestHighLevelClient
- 创建XxxIndexRequest;XXX是Create、Get、Delete
- 准备DSL(Create时需要,其它是无参)
- 发送请求;调用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete
-
新增文档
- 要将数据库的酒店数据查询出来,导入到hotel索引库,实现酒店数据的CRUD
- 索引库实体类
- 数据库查询后的结果是一个Hotel类型的对象;但需要转变,结构如下:
- 与我们的索引库结构存在差异:
- longitude和latitude需要合并为location
- 因此,需要定义一个新的类型,与索引库结构吻合
- 新增文档的DSL语句
- POST /{索引库名}/_doc/1
- {
- "name": "Jack",
- "age": 21
- }
- 可以看到与创建索引库类似,同样是三步走
- (1)创建Request对象
- (2)准备请求参数,也就是DSL中的JSON文档
- (3)发送请求
- 变化的地方在于,这里直接使用client.xxx()的API,不再需要client.indices()了
- 导入酒店数据,基本流程一致,但是需要考虑几点变化:
- 酒店数据来自于数据库,我们需要先查询出来,得到hotel对象
- Hotel对象需要转为HotelDoc对象
- HotelDoc需要序列化为json格式
- 在HotelDocumentTest测试类中,编写单元测试
-
查询文档
- 查询的DSL语句
- GET /hotel/_doc/{id}
- 代码大概分两步
- 准备Request对象
- 发送请求
- 不过查询的目的是得到结果,解析为HotelDoc,因此难点是结果的解析
- 结果是一个JSON
- 其中文档放在一个_source属性中,因此解析就是拿到_source,反序列化为Java对象即可
- 与之前类似,也是三步走:
- (1)准备Request对象;这次是查询,所以是GetRequest
- (2)发送请求,得到结果。因为是查询,这里调用client.get()方法
- (3)解析结果,就是对JSON做反序列化
- 在HotelDocumentTest测试类中,编写单元测试
-
更新文档
- 修改之前讲过两种方式:
- 全量修改:本质是先根据id删除,再新增
- 增量修改:修改文档中的指定字段值
- 在RestClient的API中,全量修改与新增的API完全一致,判断依据是ID:
- 如果新增时,ID已经存在,则修改
- 如果新增时,ID不存在,则新增
- 与之前类似,也是三步走:
- (1)准备Request对象;这次是修改,所以是UpdateRequest
- (2)准备参数;也就是JSON文档,里面包含要修改的字段
- (3)更新文档;这里调用client.update()方法
- 在HotelDocumentTest测试类中,编写单元测试
-
删除文档
- 删除的DSL为
- DELETE /hotel/_doc/{id}
- 与查询相比,仅仅是请求方式从GET变成DELETE,可以想象Java代码应该依然是三步走
- (1)准备Request对象,因为是删除,这次是DeleteRequest对象;要指定索引库名和id
- (2)准备参数,无参
- (3)发送请求;因为是删除,所以是client.delete()方法
- 编写单元测试
-
批量导入文档
- 利用BulkRequest批量将数据库数据导入到索引库中
- 步骤如下:
- 利用mybatis-plus查询酒店数据
- 将查询到的酒店数据(Hotel)转换为文档类型数据(HotelDoc)
- 利用JavaRestClient中的BulkRequest批处理,实现批量新增文档
- 批量处理BulkRequest
- 其本质就是将多个普通的CRUD请求组合在一起发送
- 其中提供了一个add方法,用来添加其他请求
- 可以看到,能添加的请求包括:
- IndexRequest,也就是新增
- UpdateRequest,也就是修改
- DeleteRequest,也就是删除
- 因此Bulk中添加了多个IndexRequest,就是批量新增功能了
- 其实还是三步走:
- (1)创建Request对象;这里是BulkRequest
- (2)准备参数;批处理的参数,就是其它Request对象,这里就是多个IndexRequest
- (3)发起请求;这里是批处理,调用的方法为client.bulk()方法
- 在导入酒店数据时,将上述代码改造成for循环处理即可
- 在HotelDocumentTest测试类中,编写单元测试
-
小结
- 文档操作的基本步骤:
- 初始化RestHighLevelClient
- 创建XxxRequest;XXX是Index、Get、Update、Delete、Bulk
- 准备参数(Index、Update、Bulk时需要)
- 发送请求;调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete、bulk
- 解析结果(Get时需要)