1. RestClient查询文档
文档的查询同样适用 RestHighLevelClient对象,基本步骤包括:
-
1)准备Request对象
-
2)准备请求参数
-
3)发起请求
-
4)解析响应
1.1.快速入门
我们以match_all查询为例
1.1.1. 发起查询请求

代码解读:
-
第一步,创建
SearchRequest对象,指定索引库名 -
第二步,利用
request.source()构建DSL,DSL中可以包含查询、分页、排序、高亮等-
query():代表查询条件,利用QueryBuilders.matchAllQuery()构建一个match_all查询的DSL
-
-
第三步,利用client.search()发送请求,得到响应
这里关键的API有两个,一个是request.source(),其中包含了查询、排序、分页、高亮等所有功能:

另一个是QueryBuilders,其中包含match、term、function_score、bool等各种查询:

1.1.2.解析响应
响应结果的解析:

elasticsearch返回的结果是一个JSON字符串,结构包含:
-
hits:命中的结果-
total:总条数,其中的value是具体的总条数值 -
max_score:所有结果中得分最高的文档的相关性算分 -
hits:搜索结果的文档数组,其中的每个文档都是一个json对象-
_source:文档中的原始数据,也是json对象
-
-
因此,我们解析响应结果,就是逐层解析JSON字符串,流程如下:
-
SearchHits:通过response.getHits()获取,就是JSON中的最外层的hits,代表命中的结果-
SearchHits#getTotalHits().value:获取总条数信息 -
SearchHits#getHits():获取SearchHit数组,也就是文档数组-
SearchHit#getSourceAsString():获取文档结果中的_source,也就是原始的json文档数据
-
-
1.1.3.完整代码
完整代码如下:
@Test
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);
}
private void handleResponse(SearchResponse response) {
// 4.解析响应
SearchHits searchHits = response.getHits();
// 4.1.获取总条数
long total = searchHits.getTotalHits().value;
System.out.println("共搜索到" + total + "条数据");
// 4.2.文档数组
SearchHit[] hits = searchHits.getHits();
// 4.3.遍历
for (SearchHit hit : hits) {
// 获取文档source
String json = hit.getSourceAsString();
// 反序列化
HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
System.out.println("hotelDoc = " + hotelDoc);
}
}
1.1.4.小结
查询的基本步骤是:
-
创建SearchRequest对象
-
准备Request.source(),也就是DSL。
① QueryBuilders来构建查询条件
② 传入Request.source() 的 query() 方法
-
发送请求,得到结果
-
解析结果(参考JSON结果,从外到内,逐层解析)
1.2.match查询
全文检索的match和multi_match查询与match_all的API基本一致。差别是查询条件,也就是query的部分。

因此,Java代码上的差异主要是request.source().query()中的参数了。同样是利用QueryBuilders提供的方法:

而结果解析代码则完全一致,可以抽取并共享。
完整代码如下:
@Test
void testMatch() throws IOException {
// 1.准备Request
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source()
.query(QueryBuilders.matchQuery("all", "如家"));
// 3.发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 4.解析响应
handleResponse(response);
}
1.3.精确查询
精确查询主要是两者:
-
term:词条精确匹配
-
range:范围查询
与之前的查询相比,差异同样在查询条件,其它都一样。
查询条件构造的API如下:

1.4.bool查询
布尔查询是用must、must_not、filter等方式组合其它查询,代码示例如下:

可以看到,API与其它查询的差别同样是在查询条件的构建,QueryBuilders,结果解析等其他代码完全不变。
完整代码如下:
@Test
void testBool() throws IOException {
//1.准备Request
SearchRequest request = new SearchRequest("hotel");
//2.准备DSL
//2.1.准备BooleanQuery
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//2.2.添加term
boolQuery.must(QueryBuilders.termQuery("city","北京"));
//2.3.添加range
boolQuery.filter(QueryBuilders.rangeQuery("price").lte(450));
request.source().query(boolQuery);
//3.发送请

本文介绍了使用RestClient进行Elasticsearch文档查询,包括match、精确、bool等查询方式,以及排序、分页和高亮处理。还通过黑马旅游案例,详细阐述了酒店搜索和分页、结果过滤、周边酒店排序和竞价排名等功能的实现,涉及实体类定义、业务逻辑修改等内容。
最低0.47元/天 解锁文章

1401

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



