当前位置:   article > 正文

ElasticSearch - RestClient操作ES基本操作_es restclient

es restclient

目录

什么是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时需要)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/659193
推荐阅读
相关标签
  

闽ICP备14008679号