19-RestClient查询文档-快速入门

发布时间 2023-05-23 14:52:17作者: JustJavaIt

我们以match_all查询为例

 发起查询请求

 代码解读

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

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

  query():代表查询条件,利用QueryBuilders.matchAllQuery()构建一个match_all查询的DSL

第三步,利用client.search()发送请求,得到响应

这里关键的API有两个,一个是request.source(),其中包含了查询、排序、分页、高亮等所有功能:

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

 解析响应

响应结果的解析:

 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 @Test
 2     void testMatchAll() throws IOException {
 3         // 1.准备request
 4         SearchRequest request = new SearchRequest("hotel");
 5         // 2.准备请求参数
 6         request.source().query(QueryBuilders.matchAllQuery());
 7         // 3.发送请求,得到响应
 8         SearchResponse response = client.search(request, RequestOptions.DEFAULT);
 9         // 4.结果解析
10         handleResponse(response);
11     }
12 
13 private void handleResponse(SearchResponse response) {
14         SearchHits searchHits = response.getHits();
15         // 4.1.总条数
16         long total = searchHits.getTotalHits().value;
17         System.out.println("总条数:" + total);
18         // 4.2.获取文档数组
19         SearchHit[] hits = searchHits.getHits();
20         // 4.3.遍历
21         for (SearchHit hit : hits) {
22             // 4.4.获取source
23             String json = hit.getSourceAsString();
24             // 4.5.反序列化,非高亮的
25             HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
26             // 4.6.处理高亮结果
27             // 1)获取高亮map
28             Map<String, HighlightField> map = hit.getHighlightFields();
29             // 2)根据字段名,获取高亮结果
30             HighlightField highlightField = map.get("name");
31 
32             if(null != highlightField){
33                 // 3)获取高亮结果字符串数组中的第1个元素
34                 String hName = highlightField.getFragments()[0].toString();
35                 // 4)把高亮结果放到HotelDoc中
36                 hotelDoc.setName(hName);
37             }
38             // 4.7.打印
39             System.out.println(hotelDoc);
40         }
41     }
View Code