6、RestClient操作文档
6、RestClient操作文档
基本步骤包括:
- 创建request对象
- 准备请求参数(DSL语句)
- 提交请求
- 解析结果
6.1 快速入门
发送请求
以match_all 查询为例
代码解读:
创建
SearchRequest
对象,指定索引库名构建DSL语句,包括查询、分页、排序、高亮
query
: 代表查询条件,利用QueryBuilders.matchAllQuery()
构建一个macth_all的查询DSL
使用
client.search()
发送请求
关键API一个是 request.source()
,其中包含了
- 查询
query
- 排序
sort
- 分页
form
size
- 高亮
highlighter

另一个是 QueryBuilder
, 其中包含match、term、function_score、bool等各种查询:
解析响应
响应结果的解析:
完整代码
@Autowired
RestHighLevelClient client;
/**
* matchAll查询请求
*/
@Test
void testMachAll() throws IOException {
//1.创建请求
SearchRequest request = new SearchRequest("hotel");
//2.创建请求体
request.source().query(QueryBuilders.matchAllQuery());
//3.发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析结果
extracted(response);
}
/**
* 数据解析
* @param response
*/
private static void extracted(SearchResponse response) {
SearchHits hits = response.getHits();
//4.1 获取总条数
long total = hits.getTotalHits().value;
System.out.println("总条数:" + total);
//4.2 获取文档数组
SearchHit[] hits1 = hits.getHits();
Arrays.stream(hits1).forEach(hit -> {
//4.3 获取文档source
String sourceAsString = hit.getSourceAsString();
HotelDoc hotel = JSON.parseObject(sourceAsString, HotelDoc.class);
System.out.println(hotel);
System.out.println("-----------------------------");
});
}
6.2 match查询
全文检索的match和multi_match查询与match_all的API基本一致。差别是查询条件,也就是query的部分。
因此,Java代码上的差异主要是request.source().query()中的参数了。同样是利用QueryBuilders提供的方法:
完整代码如下:
/**
* matchA条件查询
*/
@Test
void testMatch() throws IOException {
//1.创建请求
SearchRequest request = new SearchRequest("hotel");
//2.创建请求体
request.source().query(QueryBuilders.matchQuery("name", "如家"));
//3.发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析结果
extracted(response);
}
数据解析同上
6.3 精确查询
精确查询分为两种:
term
:词条精确匹配range
:范围匹配
完整代码如下:
/**
* term 精确查询
*/
@Test
void testTerm() throws IOException {
//1.创建请求
SearchRequest request = new SearchRequest("hotel");
//2.创建请求体
request.source().query(QueryBuilders.termQuery("city", "上海"));
//3.发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析结果
extracted(response);
}
6.4 布尔查询
布尔查询是由 must、must_not、filter等方式组合其他查询
完整代码如下:
/**
* 布尔查询
*/
@Test
void booleanQuery() throws IOException {
//1.创建请求
SearchRequest request = new SearchRequest("hotel");
//2.创建请求体
//2.1 创建布尔查询对象
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
//2.2 添加条件
boolQueryBuilder.must(QueryBuilders.termQuery("city", "上海"));
boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").lte(300));
//2.3 设置到请求体中
request.source().query(boolQueryBuilder);
//3.发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析结果
extracted(response);
}
6.5 排序、分页
搜索结果的排序和分页是与query同级的参数,因此同样是使用request.source()来设置。
对应的API如下:
完整代码如下:
/**
* 排序、分页
*/
@Test
void testSort() throws IOException {
//定义页码 每页大小
int page = 1;
int size = 5;
//1.创建请求
SearchRequest request = new SearchRequest("hotel");
//2.创建请求体
//2.1 query
request.source().query(QueryBuilders.matchAllQuery());
//2.2 sort排序 一:排序字段 二:排序方式
request.source().sort("price", SortOrder.DESC);
//2.3 分页 from从第几条数据开始 size页码大小
request.source().from((page-1)*size).size(size);
//3.发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析结果
extracted(response);
}
6.6 高亮处理
高亮的结果与查询的文档结果默认是分离的,并不在一起。
因此解析高亮的代码需要额外处理:
完整代码如下:
/**
* 高亮展示
*/
@Test
void testHighlight() throws IOException {
//1.创建请求
SearchRequest request = new SearchRequest("hotel");
//2.创建请求体
request.source().query(QueryBuilders.matchQuery("name", "如家"));
request.source().highlighter(new HighlightBuilder()
.field("name")
.requireFieldMatch(false));
//3.发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析结果
SearchHit[] hits = response.getHits().getHits();
//4.1获取总条数
System.out.println("总条数 :"+response.getHits().getTotalHits());
//4.2 遍历
Arrays.stream(hits).forEach(
hit->{
//4.3 获取封装文档source
String sourceAsString = hit.getSourceAsString();
HotelDoc hotelDoc = JSON.parseObject(sourceAsString, HotelDoc.class);
//4.4 获取设置高亮字段
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
HighlightField highlightField = highlightFields.get("name");
Text[] fragments = highlightField.getFragments();
String name = fragments[0].toString();
hotelDoc.setName(name);
//打印
System.out.println(hotelDoc);
System.out.println("-----------------------------");
}
);
}