6.3 RestClient查询文档

一、快速入门

  1. 通过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);
            }
    
        }

    备注:所谓解析,就是按照结果逐级获取

  2. RestAPI中其中构建DSL是通过HighLevelRestClient中的resource()来实现的,期中包含了查询、排序、分页、高亮等所有功能

  3. RestAPI中其中构建查询条件的核心部分是由一个名为QueryBuilders的工具类提供的,其中包含了各种查询方法

二、match查询

  1. 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)即可

五、排序、分页、高亮

  1. 排序和分页

    搜索结果的排序和分页是与query同级的参数,对应的api如下

    // 分页
    request.source().from(0).size(5);
    // 排序
    request.source().sort("字段名", SortOrder.ASC);
  2. 高亮

    高亮API包括请求DSL构建和结果解析两部分

    1. 请求DSL构建

      request.source().highlighter(new HighlightBuilder()
                                   .fueld("字段名")
                                   .requireFieldMatch(false)   // 是否需要与查询字段匹配
                                  );

      备注:不可以对全查进行高亮

    2. 处理高亮

      因为高亮内容与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);
              }
          }

      备注:直接修改解析内容,即可

最后更新于

这有帮助吗?