RestAPI
1. RestClient
ES 官方提供了各种不同语言的 客户端,用来操作 ES,这些客户端的本质就是组装 DSL 语句,通过 HTTP 请求发送给 ES。

2. 操作索引库
索引库操作的基本步骤:
- 初始化
RestHighLevelClient
- 创建
XxxIndexRequest
(Xxx 是 Create, Get, Delete) - 准备 DSL(Create 时需要)
- 发送请求——调用
RestHighLevelClient#indices().xxx()
方法,xxx 是create
,exists
,delete
案例——根据酒店数据创建索引库,索引库名为 hotel,mapping 属性根据数据库结构定义:
导入课前资料 Demo:
tb_hotel.sql
,hotel-demo
分析数据结构,定义 mapping 属性——考虑字段名、数据类型、是否参与搜索、是否分词、如果分词那么分词器是什么
初始化 JavaRestClient
引入 ES 的 RestHighLevelClient 依赖:
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>
由于 SpringBoot 默认的 ES 版本是 7.6.2,因此要覆盖默认的 ES 版本:
<properties> <java.version>1.8</java.version> <elasticsearch.version>7.12.1</elasticsearch.version> </properties>
初始化 RestHighLevelClient:
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.150.101:9200")));
利用 JavaRestClient 创建索引库
利用 JavaRestClient 删除索引库
@Test void testDeleteHotelIndex() throws IOException { // 1. 创建 Request 对象 DeleteIndexRequest request = new DeleteIndexRequest("hotel"); // 2. 发起请求 client.indices().delete(request, RequestOptions.DEFAULT); }
利用 JavaRestClient 判断索引库是否存在
@Test void testExistsHotelIndex() throws IOException { // 1. 创建 Request 对象 GetIndexRequest request = new GetIndexRequest("hotel"); // 2. 发起请求 boolean exists = client.indices().exists(request, RequestOptions.DEFAULT); // 3. 输出 System.out.println(exists); }
3. 操作文档
文档操作的基本步骤:
- 初始化
RestHighLevelClient
- 创建 XxxRequest(Xxx 是 Index, Get, Update, Delete)
- 准备参数(Index 和 Update 时需要)
- 发送请求——调用
RestHighLevelClient#.xxx()
方法,xxx 是 index, get, update, delete - 解析结果(Get 时需要)
案例——去数据库查询酒店数据,导入到 hotel 索引库,实现酒店数据的 CRUD:
初始化 JavaRestClient:
public class ElasticsearchDocumentTest { // 客户端 private RestHighLevelClient client; @BeforeEach void setUp() { client = new RestHighLevelClient(RestClient.builder(HttpPost.create("http://192.168.150.101:9200"))); } @AfterEach void tearDown() throws IOException { client.close(); } }
新增酒店数据
根据 id 查询酒店数据
根据 id 查询到的文档数据是 json,需要反序列化为 Java 对象
根据 id 修改酒店数据
依旧可分为全量更新与局部更新。
根据 id 删除文档数据
批量处理
需求:批量查询酒店数据,然后批量导入索引库中
思路:
利用 mybatis-plus 查询酒店数据
将查询到的酒店数据(Hotel)转换为文档类型数据(HotelDoc)
利用 JavaRestClient 中的 Bulk 批处理,实现批量新增文档,示例代码:
@Test void testBulkRequest() throws IOException() { // 批量查询酒店数据 List<Hotel> hotels = hotelService.list(); // 1. 创建 Request BulkRequest request = new BulkRequest(); // 2. 准备参数,添加多个新增的 Request for (Hotel hotel : hotels) { // 转换为文档类型 HotelDoc HotelDoc hotelDoc = new HotelDoc(hotel); // 创建新增文档的 Request 对象 request.add(new IndexRequest("hotel") .id(hotelDoc.getId().toString() .source(JSON.toJSONString(hotelDoc), XContentType.JSON)) ); } // 3. 发送请求 client.bulk(request, RequestOptions.DEFAULT); }
分布式搜索引擎——Elasticsearch 搜索功能。
4. 搜索/查询文档
通性概述
查询的基本步骤是:
- 创建
SearchRequest
对象 - 准备
Request.source()
,也就是 DSLQueryBuilders
构建查询条件- 传入
Request.source()
的query()
方法
- 发送请求,得到结果
- 解析结果(参考 JSON 结果,从外到内,逐层解析)
RestAPI 中构建 DSL 是通过HighLevelRestClient
中的resource()
来实现的,其中包含了查询、排序、分页、高亮等所有功能:

RestAPI 中构建查询条件的核心部分是由一个名为 QueryBuilders 的工具类提供的,其中包含了各种查询方法:

match 查询
match_all
这里通过match_all
来演示基本的 API:


match、multi_match
全文检索的match
和multi_match
查询与match_all
的 API 基本一致,差别是查询条件,也就是 query 的部分,同样是利用QueryBuilders
提供的方法:
// 单字段查询
QueryBuilders.matchQuery("all", "如家");
// 多字段查询
QueryBuilders.multiMatchQuery("如家", "name", "business");

精确查询
// 词条查询
QueryBuilders.termQuery("city", "杭州");
// 范围查询
QueryBuilders.rangeQuery("price").gte(100).let(150);

复合查询
// 创建布尔查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 添加 must 条件
boolQuery.must(QueryBuilders.termQuery("city", "杭州"));
// 添加 filter 条件
boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));

排序、分页、高亮
搜索结果的排序和分页是与 query 同级的参数,对应的 API 如下:

高亮 API 包括请求 DSL 构建和结果解析两部分:
DSL 构建:
结果解析:
5. 数据聚合
RestAPI 实现聚合
以品牌聚合为例:

