es7.+(五)-- springBoot使用ES-Rest-Client整合high-level-client


目录
  • 为什么使用ES-Rest-Client
    • 其他工具
      • 通过9300:tcp
      • 构建
        • 导入maven地址
        • 使用---详细见官方文档
          • 存储信息到es
          • 查询和聚合分析数据
          • 实现高亮检索
          • 实现复合查询
          • 实现多重查询

      为什么使用ES-Rest-Client

      其他工具

      通过9300:tcp

      • 由于springboot版本不同,transport-api.jar不同,不能适配较高的es版本
      • 7.x不建议使用,8.0要废弃

      通过9200:http发送请求

      JestClient:非官方,更新慢
      RestTemplate:spring自带的,模拟发送Http请求,ES很多操作(DSL语句)需要自己封装,麻烦
      HttpClient:同上

      Elasticsearch-Rest-Client:官方提供,封装了ES操作,API层次分明,上手简单
      (https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-hight.html)

      构建

      导入maven地址

      
              
                  org.elasticsearch.client
                  elasticsearch-rest-high-level-client
                  7.6.2
              
      
      • 查看springboot2.4.3的es依赖配置

        发现是7.9.3版本而我们用的是7.6.2版本

      • 在pom.xml中配置版本号为7.6.2

      可以看到maven依赖全部变为7.6.2了

      使用---详细见官方文档

      Java Rest Client官方文档,(https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.x/java-rest-high.html)

      存储信息到es

      public void indexData() throws IOException {
              //创建构造器指定idnex索引
              IndexRequest indexRequest = new IndexRequest("users");
              indexRequest.id("1");//id
              //以k-v形式存储
             // indexRequest.source("userName","zhangsan","age",18,"gender","男");
      
              //以实体类存储
              User user = new User();
              user.setAge(18);
              user.setUserName("zhansan");
              user.setGender("男");
              ObjectMapper objectMapper = new ObjectMapper();
              String json = objectMapper.writeValueAsString(user);
              indexRequest.source(json, XContentType.JSON);//要保存的内容,一定要传内容类型
      
              //执行操作
              IndexResponse index = client.index(indexRequest, ElasticSearchConfig.COMMON_OPTIONS);
      
              //提取有用的响应数据
              System.out.println(index);
          }
      
      

      查询和聚合分析数据

      各种查询在QueryBuilders工具类中都有
      AggregationBuilders是聚合分析的工具类

       public void searchData() throws IOException{
              //创建检索请求
              SearchRequest searchRequest = new SearchRequest();
              searchRequest.indices("bank");//指定检索的索引
              //指定DSL,检索条件
              SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
              //构造检索条件
              sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
      
              //使用聚合
              //1).按照年龄大小分布进行聚合
              TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
              sourceBuilder.aggregation(ageAgg);
      
              //2).计算平均薪资
              AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
              sourceBuilder.aggregation(balanceAvg);
      
              //System.out.println("检索条件"+sourceBuilder.toString());
              System.out.println(sourceBuilder.toString());
      //        searchSourceBuilder.from();
      //        searchSourceBuilder.size();
      //        searchSourceBuilder.aggregation();
      
              searchRequest.source(sourceBuilder);
      
              //执行检索
              SearchResponse searchResponse = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);
              //System.out.println(searchResponse.toString());
      
              //3.分析结果 searchResponse
              ObjectMapper objectMapper = new ObjectMapper();
              //转化为map可以提取出想要的值
           //   Map map = objectMapper.readValue(searchResponse.toString(), Map.class);
      
              //官方还提供了简便方法可以直接获取查询,聚合的结果
              SearchHits hits = searchResponse.getHits();
              SearchHit[] searchHits = hits.getHits();//获取所有命中的记录
              for (SearchHit hit:searchHits){
                  String json = hit.getSourceAsString();
                  Account account = objectMapper.readValue(json,Account.class);
              }
      
              //获取检索到的聚合分析信息
              Aggregations aggregations = searchResponse.getAggregations();
              aggregations.asList();//将所有聚合信息转化为list
              for(Aggregation aggregation1:aggregations.asList()){
                  aggregation1.getName();//打印出当前聚合名字,例如ageAgg、balanceAvg
              }
      
              Terms ageAgg1 = aggregations.get("ageAgg");
              for (Terms.Bucket bucket:ageAgg1.getBuckets()){
                  String keyAsString = bucket.getKeyAsString();
                  System.out.println("年龄"+keyAsString);
              }
      
              Avg balanceAvg1 = aggregations.get("balanceAvg");
              System.out.println("获取平均薪资"+balanceAvg1.getValue());
          }
      

      实现高亮检索

      (https://blog.csdn.net/qq_37362891/article/details/103295317)

      实现复合查询

      (https://blog.csdn.net/u014646662/article/details/97130086)

      实现多重查询

       /**
           * 实现多重查询
           */
          @Test
          public void test9() throws IOException {
              MultiSearchRequest request = new MultiSearchRequest();
              SearchRequest firstSearchRequest = new SearchRequest();
              SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
              searchSourceBuilder.query(QueryBuilders.matchQuery("goodsTitle","英雄联盟"));
              searchSourceBuilder.from(0);
              searchSourceBuilder.size(10);
              firstSearchRequest.source(searchSourceBuilder);
              request.add(firstSearchRequest);
              System.out.println("检索一:"+searchSourceBuilder.toString());
      
      
              SearchRequest secondSearchRequest = new SearchRequest();
              searchSourceBuilder = new SearchSourceBuilder();
      
              searchSourceBuilder.query(QueryBuilders.matchQuery("goodsDes","英雄联盟"));
              searchSourceBuilder.from(0);
              searchSourceBuilder.size(10);
              secondSearchRequest.source(searchSourceBuilder);
              System.out.println("检索二:"+searchSourceBuilder.toString());
              request.add(secondSearchRequest);
      
      
              System.out.println(request.toString());
              MultiSearchResponse getResponse = client.msearch(request,ElasticSearchConfig.COMMON_OPTIONS);
              System.out.println(getResponse);
          }