导航栏

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

为什么使用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地址

<!--导入Elasticsearch-Rest-Client的maven地址-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.6.2</version>
        </dependency>
  • 查看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);
    }
posted @ 2021-03-03 20:45  RickZ  阅读(1242)  评论(0编辑  收藏  举报