学习RestClient之前需要先熟练使用DSL:ES备忘清单

ES为各种客户端提供了RestAPI来操作DSL,目前基于Spring Boot工程使用的是Java High Level Rest Client客户端。

1.入门

  • 初始化RestClient,引入RestHighLevelClient依赖
1
2
3
4
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

注意:依赖的版本最好与客户端的版本号一致,SpringBoot工程可以使用自定义版本覆盖默认的依赖。

  • 初始化RestHighLevelClient

初始化的代码如下:

1
2
3
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://192.168.2.101:9200")
));

2.索引库操作

索引库操作的基本步骤:

  • 初始化RestHighLevelClient
  • 创建Request对象 (new XxxIndexRequest
    1. CreateIndexRequest (创建索引库)
    2. DeleteIndexRequest (删除索引库)
    3. GetIndexRequest (判断索引库是否存在)
  • 准备请求参数(request.source
  • 发送请求,client.indices() 方法的返回值是IndicesClient类型,封装了所有与索引库操作有关的方法。

相关代码示例:

1
2
3
4
5
6
7
8
9
@Test
void createHotelIndex() throws IOException {
// 1.创建Request对象
CreateIndexRequest request = new CreateIndexRequest("hotel");
// 2.准备请求的参数:DSL语句
request.source(MAPPING_TEMPLATE, XContentType.JSON);
// 3.发送请求
client.indices().create(request, RequestOptions.DEFAULT);
}

3.文档操作

文档操作的基本步骤:

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

相关代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Test
void testBulkRequest() throws IOException {
// 批量查询酒店数据
List<Hotel> hotels = hotelService.list();

// 1.创建Request
BulkRequest request = new BulkRequest();
// 2.准备参数,添加多个新增的Request
for (Hotel hotel : hotels) {
// 2.1.转换为文档类型HotelDoc
HotelDoc hotelDoc = new HotelDoc(hotel);
// 2.2.创建新增文档的Request对象
request.add(new IndexRequest("hotel")
.id(hotelDoc.getId().toString())
.source(JSON.toJSONString(hotelDoc), XContentType.JSON));
}
// 3.发送请求
client.bulk(request, RequestOptions.DEFAULT);
}

4.查询文档

文档的查询同样适用 RestHighLevelClient对象,基本步骤包括:

  • 准备Request对象
  • 准备请求参数
  • 发起请求
  • 解析响应

发起查询请求

  • 第一步,创建SearchRequest对象,指定索引库名

  • 第二步,利用request.source()构建DSL,DSL中可以包含查询、分页、排序、高亮等

    • query():代表查询条件,利用QueryBuilders.matchAllQuery()构建一个match_all查询的DSL
  • 第三步,利用client.search()发送请求,得到响应