核心方法:通过Java RestClient API得到的响应格式是JSON,需要对响应进行数据解析
/**
* 解析响应
* @param response 响应结果(json数据)
*/
private void handleResponse(SearchResponse response) {
// (hits为封装的json数据,包含要查询的所有数据)
SearchHits searchHits = response.getHits();
long total = searchHits.getTotalHits().value;
System.out.println("总数据:" + total);
// 4.1 、获取查询结果的数组
SearchHit[] hits = searchHits.getHits();
for (SearchHit hit : hits) {
String json = hit.getSourceAsString();
HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
System.out.println(hotelDoc);
}
}
-
查询所有(入门)
void testMatchAll() throws IOException {
// 1、准备request
SearchRequest request = new SearchRequest("hotel");
// 2、编写DSL语句
request.source().query(QueryBuilders.matchAllQuery());
// 3、发送请求获取响应
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 4、解析结果
handleResponse(response);
}
-
Boolean查询(组合查询)
将查询条件一个个添加到boolQuery中组合
void testBooleanQuery() throws IOException {
// 1、准备request
SearchRequest request = new SearchRequest("hotel");
// 2、编写DSL语句
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.termQuery("city", "上海"));
boolQuery.filter(QueryBuilders.rangeQuery("price").lte(300));
request.source().query(boolQuery);
// 3、发送请求获取响应
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 4、解析结果
handleResponse(response);
}
排序和分页
- sort():排序
- from():分页起始页
- size():分页大小
void testSortAndPage() throws IOException {
int page = 3; int size = 5;
// 1、准备request
SearchRequest request = new SearchRequest("hotel");
// 2、编写DSL语句
request.source().query(QueryBuilders.matchAllQuery());
request.source().sort("price", SortOrder.DESC).from((page - 1) * size).size(size);
// 3、发送请求获取响应
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 4、解析结果
handleResponse(response);
}
查询结果高亮显示
高亮显示默认要求匹配字段和高亮字段要匹配:requireFieldMatch(false):修改高亮匹配为false

void testHighlight() throws IOException {
// 1、准备request
SearchRequest request = new SearchRequest("hotel");
// 2.1、编写DSL语句
request.source().query(QueryBuilders.matchQuery("name", "如家"));
// 2.2、 高亮显示
request.source().highlighter(new HighlightBuilder().field("name"));
// 3、发送请求获取响应
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 4、解析结果
handleResponse(response);
}
在查询结果中,高亮结果在hits中的highlight中,需要额外解析
// 高亮结果解析
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
// 判断Map集合是否为空
if (!CollectionUtils.isEmpty(highlightFields)) {
HighlightField highlightField = highlightFields.get("name");
if (highlightField != null) {
String name = highlightField.fragments()[0].toString();
hotelDoc.setName(name);
}
}
本文档介绍了如何使用Java RestClient API进行查询、排序、分页操作,并重点讲解了查询结果的高亮显示。在查询结果中,高亮部分位于hits的highlight字段,需要额外解析。同时,提到了高亮显示的配置,如设置requireFieldMatch为false以实现不同匹配字段和高亮字段的配合。
606

被折叠的 条评论
为什么被折叠?



