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);
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM