【Elasticsearch】RestClient操作文档

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 【Elasticsearch】RestClient操作文档

5.RestClient操作文档

为了与索引库操作分离,我们再次参加一个测试类,做两件事情:

  • 初始化RestHighLevelClient
  • 我们的酒店数据在数据库,需要利用IHotelService去查询,所以注入这个接口
1. @Data
2. @TableName("tb_hotel")
3. public class Hotel {
4. @TableId(type = IdType.INPUT)
5. private Long id;
6. private String name;
7. private String address;
8. private Integer price;
9. private Integer score;
10. private String brand;
11. private String city;
12. private String starName;
13. private String business;
14. private String longitude;
15. private String latitude;
16. private String pic;
17. }

5.1.新增文档

我们要将数据库的酒店数据查询出来,写入elasticsearch中。

5.1.1.索引库实体类

数据库查询后的结果是一个Hotel类型的对象。结构如下:

与我们的索引库结构存在差异:

  • longitude和latitude需要合并为location

因此,我们需要定义一个新的类型,与索引库结构吻合:

1. package cn.itcast.hotel.pojo;
2. 
3. import lombok.Data;
4. import lombok.NoArgsConstructor;
5. 
6. @Data
7. @NoArgsConstructor
8. public class HotelDoc {
9. private Long id;
10. private String name;
11. private String address;
12. private Integer price;
13. private Integer score;
14. private String brand;
15. private String city;
16. private String starName;
17. private String business;
18. private String location;
19. private String pic;
20. 
21. public HotelDoc(Hotel hotel) {
22. this.id = hotel.getId();
23. this.name = hotel.getName();
24. this.address = hotel.getAddress();
25. this.price = hotel.getPrice();
26. this.score = hotel.getScore();
27. this.brand = hotel.getBrand();
28. this.city = hotel.getCity();
29. this.starName = hotel.getStarName();
30. this.business = hotel.getBusiness();
31. this.location = hotel.getLatitude() + ", " + hotel.getLongitude();
32. this.pic = hotel.getPic();
33.     }
34. }

5.1.2.语法说明

新增文档的DSL语句如下:

POST /{索引库名}/_doc/1

{
    "name": "Jack",
    "age": 21
}

对应的java代码如图:

可以看到与创建索引库类似,同样是三步走:

  • 1)创建Request对象
  • 2)准备请求参数,也就是DSL中的JSON文档
  • 3)发送请求

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

5.1.3.完整代码

我们导入酒店数据,基本流程一致,但是需要考虑几点变化:

  • 酒店数据来自于数据库,我们需要先查询出来,得到hotel对象
  • hotel对象需要转为HotelDoc对象
  • HotelDoc需要序列化为json格式

因此,代码整体步骤如下:

  • 1)根据id查询酒店数据Hotel
  • 2)将Hotel封装为HotelDoc
  • 3)将HotelDoc序列化为JSON
  • 4)创建IndexRequest,指定索引库名和id
  • 5)准备请求参数,也就是JSON文档
  • 6)发送请求

在hotel-demo的HotelDocumentTest测试类中,编写单元测试:

1. @Test
2. void testAddDocument() throws IOException {
3. // 1.根据id查询酒店数据
4. Hotel hotel = hotelService.getById(61083L);
5. // 2.转换为文档类型
6. HotelDoc hotelDoc = new HotelDoc(hotel);
7. // 3.将HotelDoc转json
8. String json = JSON.toJSONString(hotelDoc);
9. 
10. // 1.准备Request对象
11. IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
12. // 2.准备Json文档
13.     request.source(json, XContentType.JSON);
14. // 3.发送请求
15.     client.index(request, RequestOptions.DEFAULT);
16. }

5.2.查询文档

5.2.1.语法说明

查询的DSL语句如下:

GET /hotel/_doc/{id}

非常简单,因此代码大概分两步:

  • 准备Request对象
  • 发送请求

不过查询的目的是得到结果,解析为HotelDoc,因此难点是结果的解析。完整代码如下:

可以看到,结果是一个JSON,其中文档放在一个_source属性中,因此解析就是拿到_source,反序列化为Java对象即可。

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

  • 1)准备Request对象。这次是查询,所以是GetRequest
  • 2)发送请求,得到结果。因为是查询,这里调用client.get()方法
  • 3)解析结果,就是对JSON做反序列化

5.2.2.完整代码

在hotel-demo的HotelDocumentTest测试类中,编写单元测试:

1. @Test
2. void testGetDocumentById() throws IOException {
3. // 1.准备Request
4. GetRequest request = new GetRequest("hotel", "61082");
5. // 2.发送请求,得到响应
6. GetResponse response = client.get(request, RequestOptions.DEFAULT);
7. // 3.解析响应结果
8. String json = response.getSourceAsString();
9. 
10. HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
11.     System.out.println(hotelDoc);
12. }

5.3.删除文档

删除的DSL为是这样的:

DELETE /hotel/_doc/{id}

与查询相比,仅仅是请求方式从DELETE变成GET,可以想象Java代码应该依然是三步走:

  • 1)准备Request对象,因为是删除,这次是DeleteRequest对象。要指定索引库名和id
  • 2)准备参数,无参
  • 3)发送请求。因为是删除,所以是client.delete()方法

在hotel-demo的HotelDocumentTest测试类中,编写单元测试:

1. @Test
2. void testDeleteDocument() throws IOException {
3. // 1.准备Request
4. DeleteRequest request = new DeleteRequest("hotel", "61083");
5. // 2.发送请求
6.     client.delete(request, RequestOptions.DEFAULT);
7. }

5.4.修改文档

5.4.1.语法说明

修改我们讲过两种方式:

  • 全量修改:本质是先根据id删除,再新增
  • 增量修改:修改文档中的指定字段值

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

  • 如果新增时,ID已经存在,则修改
  • 如果新增时,ID不存在,则新增

这里不再赘述,我们主要关注增量修改。

代码示例如图:

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

  • 1)准备Request对象。这次是修改,所以是UpdateRequest
  • 2)准备参数。也就是JSON文档,里面包含要修改的字段
  • 3)更新文档。这里调用client.update()方法

5.4.2.完整代码

在hotel-demo的HotelDocumentTest测试类中,编写单元测试:

1. @Test
2. void testUpdateDocument() throws IOException {
3. // 1.准备Request
4. UpdateRequest request = new UpdateRequest("hotel", "61083");
5. // 2.准备请求参数
6.     request.doc(
7. "price", "952",
8. "starName", "四钻"
9.     );
10. // 3.发送请求
11.     client.update(request, RequestOptions.DEFAULT);
12. }

5.5.批量导入文档

案例需求:利用BulkRequest批量将数据库数据导入到索引库中。

步骤如下:

  • 利用mybatis-plus查询酒店数据
  • 将查询到的酒店数据(Hotel)转换为文档类型数据(HotelDoc)
  • 利用JavaRestClient中的BulkRequest批处理,实现批量新增文档

5.5.1.语法说明

批量处理BulkRequest,其本质就是将多个普通的CRUD请求组合在一起发送。

其中提供了一个add方法,用来添加其他请求:

可以看到,能添加的请求包括:

  • IndexRequest,也就是新增
  • UpdateRequest,也就是修改
  • DeleteRequest,也就是删除

因此Bulk中添加了多个IndexRequest,就是批量新增功能了。示例:

其实还是三步走:

  • 1)创建Request对象。这里是BulkRequest
  • 2)准备参数。批处理的参数,就是其它Request对象,这里就是多个IndexRequest
  • 3)发起请求。这里是批处理,调用的方法为client.bulk()方法

我们在导入酒店数据时,将上述代码改造成for循环处理即可。

5.5.2.完整代码

在hotel-demo的HotelDocumentTest测试类中,编写单元测试:

1. @Test
2. void testBulkRequest() throws IOException {
3. // 批量查询酒店数据
4.     List<Hotel> hotels = hotelService.list();
5. 
6. // 1.创建Request
7. BulkRequest request = new BulkRequest();
8. // 2.准备参数,添加多个新增的Request
9. for (Hotel hotel : hotels) {
10. // 2.1.转换为文档类型HotelDoc
11. HotelDoc hotelDoc = new HotelDoc(hotel);
12. // 2.2.创建新增文档的Request对象
13.         request.add(new IndexRequest("hotel")
14.                     .id(hotelDoc.getId().toString())
15.                     .source(JSON.toJSONString(hotelDoc), XContentType.JSON));
16.     }
17. // 3.发送请求
18.     client.bulk(request, RequestOptions.DEFAULT);
19. }

5.6.小结

文档操作的基本步骤:

  • 初始化RestHighLevelClient
  • 创建XxxRequest。XXX是Index、Get、Update、Delete、Bulk
  • 准备参数(Index、Update、Bulk时需要)
  • 发送请求。调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete、bulk
  • 解析结果(Get时需要)


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
3月前
|
JSON 自然语言处理 算法
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
DSL查询文档、RestClient查询文档、全文检索查询、精准查询、复合查询、地理坐标查询、分页、排序、高亮、黑马旅游案例
|
3月前
|
JSON 自然语言处理 数据库
ElasticSearch基础1——索引和文档。Kibana,RestClient操作索引和文档+黑马旅游ES库导入
概念、ik分词器、倒排索引、索引和文档的增删改查、RestClient对索引和文档的增删改查
ElasticSearch基础1——索引和文档。Kibana,RestClient操作索引和文档+黑马旅游ES库导入
|
4月前
|
存储 搜索推荐 API
探究:Elasticsearch 文档的 _id 是 Lucene 的 docid 吗?
【8月更文挑战第31天】在深入探索Elasticsearch(简称ES)这一强大的搜索引擎时,了解其底层存储机制——特别是与Lucene的关系,对于优化查询性能、设计高效的数据模型至关重要。其中,一个常见且容易引发误解的问题便是:Elasticsearch中文档的_id字段是否直接等同于Lucene的docid?本文将通过图文并茂的方式,详细剖析这一问题,帮助读者理解两者之间的微妙关系。
107 0
|
4月前
|
JSON 测试技术 API
黑马商城 Elasticsearch从入门到部署 RestClient操作文档
这篇文章详细介绍了如何使用Java的RestHighLevelClient客户端与Elasticsearch进行文档操作,包括新增、查询、删除、修改文档以及批量导入文档的方法,并提供了相应的代码示例和操作步骤。
|
4月前
|
JSON 自然语言处理 Java
Elasticsearch从入门到部署 文档操作 RestAPI
这篇文章详细介绍了Elasticsearch中文档的增删改查操作,并通过Java的RestHighLevelClient客户端演示了如何通过REST API与Elasticsearch进行交云,包括初始化客户端、索引库的创建、删除和存在性判断等操作。
|
4月前
|
消息中间件 监控 数据挖掘
Elasticsearch 使用误区之二——频繁更新文档
【8月更文挑战第15天】在大数据与搜索技术日益成熟的今天,Elasticsearch 作为一款分布式、RESTful 风格的搜索与数据分析引擎,凭借其强大的全文搜索能力和可扩展性,成为了众多企业和开发者的首选。然而,在使用 Elasticsearch 的过程中,一些常见的误区可能会导致性能下降或数据不一致等问题,其中“频繁更新文档”便是一个不容忽视的误区。本文将深入探讨这一误区的根源、影响及解决方案,帮助读者更好地利用 Elasticsearch。2
93 0
|
4月前
|
自然语言处理 Java 索引
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作
47 0
|
5月前
|
存储 SQL 自然语言处理
Elasticsearch 索引与文档的常用操作总结二:复杂条件查询
Elasticsearch 索引与文档的常用操作总结二:复杂条件查询
181 0
|
5月前
|
JSON API 数据格式
Elasticsearch 索引与文档的常用操作总结一
Elasticsearch 索引与文档的常用操作总结一
56 0
|
1月前
|
存储 安全 数据管理
如何在 Rocky Linux 8 上安装和配置 Elasticsearch
本文详细介绍了在 Rocky Linux 8 上安装和配置 Elasticsearch 的步骤,包括添加仓库、安装 Elasticsearch、配置文件修改、设置内存和文件描述符、启动和验证 Elasticsearch,以及常见问题的解决方法。通过这些步骤,你可以快速搭建起这个强大的分布式搜索和分析引擎。
50 5