6.3 RestClient查询文档
一、快速入门
通过match_all来演示基本API的使用
@Test public void selectAll() throws IOException { // 准备Request SearchRequest request = new SearchRequest("hotel"); // 拼接DSL参数 request.source().query(QueryBuilders.matchAllQuery()); // 发送请求 SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 解析相应结果 // System.out.println(response); SearchHits searchHits = response.getHits(); // 获取查询的总条数 long total = searchHits.getTotalHits().value; // 查询的结果数组 SearchHit[] hits = searchHits.getHits(); // 对数组进行解析 for (SearchHit hit : hits) { // 得到source String json = hit.getSourceAsString(); // 反序列化工具 HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class); // 解析或打印 System.out.println(json); System.out.println(hotelDoc); } }备注:所谓解析,就是按照结果逐级获取
RestAPI中其中构建DSL是通过HighLevelRestClient中的resource()来实现的,期中包含了查询、排序、分页、高亮等所有功能
RestAPI中其中构建查询条件的核心部分是由一个名为QueryBuilders的工具类提供的,其中包含了各种查询方法
二、match查询
match查询
@Test public void matchTest() throws IOException { // 准备request SearchRequest request = new SearchRequest("hotel"); // 拼接查询条件 request.source().query(QueryBuilders.matchQuery("name", "如家")); // 这里的name标识字段,如家表示条件值 // 发送请求 SearchResponse response = client.search(request, RequestOptions.DEFAULT); // 解析相应结果 // System.out.println(response); SearchHits searchHits = response.getHits(); // 获取查询的总条数 long total = searchHits.getTotalHits().value; // 查询的结果数组 SearchHit[] hits = searchHits.getHits(); // 对数组进行解析 for (SearchHit hit : hits) { // 得到source String json = hit.getSourceAsString(); // 反序列化工具 HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class); // 解析或打印 System.out.println(json); System.out.println(hotelDoc); } }备注:因为结果解析都是相同的,可以抽取乘一个单独的方法
Ps. IDEA中抽取方法的快捷键,选择代码后,ctrl+alt+m
如果做字段查:
QueryBuilders.multiMatchQuery("条件值", "字段名", "字段名")
三、精确查询
// 词条查询
QueryBuilders.termQuery("字段名", "条件值");
// 范围查询
QueryBuilders.rangeQuery("字段名").get(100).lte(150);备注:类似DSL语法
四、复合查询
// 创建布尔查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 添加must条件
boolQuery.must(QueryBuilders.termQuery("字段名", "条件值"));
// 添加filter条件
boolQuery.filter(QueryBuilders.rangeQuery("字段名").lte(条件值));备注:如果出现多条件的话,那么可以先创建查询,后拼接参数
然后直接拼接请求为
request.source().query(booleanQuery)即可
五、排序、分页、高亮
排序和分页
搜索结果的排序和分页是与query同级的参数,对应的api如下
// 分页 request.source().from(0).size(5); // 排序 request.source().sort("字段名", SortOrder.ASC);高亮
高亮API包括请求DSL构建和结果解析两部分
请求DSL构建
request.source().highlighter(new HighlightBuilder() .fueld("字段名") .requireFieldMatch(false) // 是否需要与查询字段匹配 );备注:不可以对全查进行高亮
处理高亮
因为高亮内容与cource是同级因此需要额外操作处理
private void handleRequesr(SearchResponse response) { // 解析相应结果 // System.out.println(response); SearchHits searchHits = response.getHits(); // 获取查询的总条数 long total = searchHits.getTotalHits().value; // 查询的结果数组 SearchHit[] hits = searchHits.getHits(); // 对数组进行解析 for (SearchHit hit : hits) { // 得到source String json = hit.getSourceAsString(); // 反序列化工具 HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class); // 高亮处理 Map<String, HighlightField> highlightFields = hit.getHighlightFields(); if (!CollectionUtils.isEmpty(highlightFields)) { // 获取高亮字段 HighlightField highlightField = highlightFields.get("name"); if (highlightField != null) { String name = highlightField.getFragments()[0].string(); hotelDoc.setName(name); } } // 解析或打印 System.out.println(json); System.out.println(hotelDoc); } }备注:直接修改解析内容,即可
最后更新于
这有帮助吗?