zoukankan      html  css  js  c++  java
  • 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);
        }
    
  • 相关阅读:
    校内模拟赛吧 ———— 2019.10.30
    牛客CSP-S提高组赛前集训营1———2019.10.29 18:30 至 22:00
    关于gcd
    洛谷 P1156 垃圾陷阱 题解
    选球游戏 题解———2019.10.19
    小梵同学前进!
    小梵同学 GO!
    先天八卦向后天八卦演进逻辑猜想
    [delphi]在DLL中多线程同步Synchronize卡死问题
    GDI与GDI+性能比较
  • 原文地址:https://www.cnblogs.com/psyduck/p/14476823.html
Copyright © 2011-2022 走看看