1.search API

详情请参考添加链接描述
在这里插入图片描述
在这里插入图片描述

2.查询条件

在这里插入图片描述

@Test
public void searchData() throws IOException {
    //1. 创建检索请求
    SearchRequest searchRequest = new SearchRequest();

    //1.1)指定索引
    searchRequest.indices("bank");
    //1.2)构造检索条件
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.matchQuery("address", "Mill"));

    System.out.println("检索条件: " + sourceBuilder);
    searchRequest.source(sourceBuilder);
    
    //2. 执行检索
    SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
    System.out.println("检索结果: " + searchResponse);
}

结果:

检索条件: {"query":{"match":{"address":{"query":"Mill","operator":"OR","prefix_length":0,"max_expansions":50,"fuzzy_transpositions":true,"lenient":false,"zero_terms_query":"NONE","auto_generate_synonyms_phrase_query":true,"boost":1.0}}}}

检索结果: {"took":6,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":4,"relation":"eq"},"max_score":5.4032025,"hits":[{"_index":"bank","_type":"account","_id":"970","_score":5.4032025,"_source":{"account_number":970,"balance":19648,"firstname":"Forbes","lastname":"Wallace","age":28,"gender":"M","address":"990 Mill Road","employer":"Pheast","email":"forbeswallace@pheast.com","city":"Lopezo","state":"AK"}},
{"_index":"bank","_type":"account","_id":"136","_score":5.4032025,"_source":{"account_number":136,"balance":45801,"firstname":"Winnie","lastname":"Holland","age":38,"gender":"M","address":"198 Mill Lane","employer":"Neteria","email":"winnieholland@neteria.com","city":"Urie","state":"IL"}},{"_index":"bank","_type":"account","_id":"345","_score":5.4032025,"_source":{"account_number":345,"balance":9812,"firstname":"Parker","lastname":"Hines","age":38,"gender":"M","address":"715 Mill Avenue","employer":"Baluba","email":"parkerhines@baluba.com","city":"Blackgum","state":"KY"}},{"_index":"bank","_type":"account","_id":"472","_score":5.4032025,"_source":{"account_number":472,"balance":25571,"firstname":"Lee","lastname":"Long","age":32,"gender":"F","address":"288 Mill Street","employer":"Comverges","email":"leelong@comverges.com","city":"Movico","state":"MT"}}]}}

3.聚合条件

在这里插入图片描述
在测试类中添加静态内部类

@ToString
@Data
static class Account {
    private int account_number;
    private int balance;
    private String firstname;
    private String lastname;
    private int age;
    private String gender;
    private String address;
    private String employer;
    private String email;
    private String city;
    private String state;
}

测试方法

@Test
public void searchData() throws IOException {
     //1. 创建检索请求
     SearchRequest searchRequest = new SearchRequest();

     //1.1)指定索引
     searchRequest.indices("bank");
     //1.2)构造检索条件
     SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
     sourceBuilder.query(QueryBuilders.matchQuery("address", "Mill"));


     //1.2.1)按照年龄分布进行聚合
     TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
     sourceBuilder.aggregation(ageAgg);

     //1.2.2)计算平均年龄
     AvgAggregationBuilder ageAvg = AggregationBuilders.avg("ageAvg").field("age");
     sourceBuilder.aggregation(ageAvg);

     //1.2.3)计算平均薪资
     AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
     sourceBuilder.aggregation(balanceAvg);

     System.out.println("检索条件: " + sourceBuilder);
     searchRequest.source(sourceBuilder);
     System.out.println();

     //2. 执行检索
     SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
     System.out.println("检索结果: " + searchResponse);
     System.out.println();

     //3. 将检索结果封装为Bean
     SearchHits hits = searchResponse.getHits();
     SearchHit[] searchHits = hits.getHits();
     for (SearchHit searchHit : searchHits) {
         String sourceAsString = searchHit.getSourceAsString();
         Account account = JSON.parseObject(sourceAsString, Account.class);
         System.out.println(account);
     }
 }

结果如下:
在这里插入图片描述
在线JSON格式化后与我们在kibana中是一致的在这里插入图片描述
在这里插入图片描述

4.分析结果

在这里插入图片描述

 /**
  * 复杂检索:在bank中搜索address中包含mill的所有人的年龄分布以及平均年龄,平均薪资
  * @throws IOException
  */
 @Test
 public void searchData() throws IOException {
     //1. 创建检索请求
     SearchRequest searchRequest = new SearchRequest();

     //1.1)指定索引
     searchRequest.indices("bank");
     //1.2)构造检索条件
     SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
     sourceBuilder.query(QueryBuilders.matchQuery("address", "Mill"));


     //1.2.1)按照年龄分布进行聚合
     TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
     sourceBuilder.aggregation(ageAgg);

     //1.2.2)计算平均年龄
     AvgAggregationBuilder ageAvg = AggregationBuilders.avg("ageAvg").field("age");
     sourceBuilder.aggregation(ageAvg);

     //1.2.3)计算平均薪资
     AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
     sourceBuilder.aggregation(balanceAvg);

     System.out.println("检索条件: " + sourceBuilder);
     searchRequest.source(sourceBuilder);
     System.out.println();

     //2. 执行检索
     SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
     System.out.println("检索结果: " + searchResponse);
     System.out.println();

     //3. 将检索结果封装为Bean
     SearchHits hits = searchResponse.getHits();
     SearchHit[] searchHits = hits.getHits();
     for (SearchHit searchHit : searchHits) {
         String sourceAsString = searchHit.getSourceAsString();
         Account account = JSON.parseObject(sourceAsString, Account.class);
         System.out.println(account);
     }
     System.out.println();

     //4. 获取聚合信息
     Aggregations aggregations = searchResponse.getAggregations();
     Terms ageAgg1 = aggregations.get("ageAgg");
     for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
         String keyAsString = bucket.getKeyAsString();
         System.out.println("年龄: " + keyAsString + " ==> " + bucket.getDocCount());
     }
     
     Avg ageAvg1 = aggregations.get("ageAvg");
     System.out.println("平均年龄: " + ageAvg1.getValue());
     System.out.println();

     Avg balanceAvg1 = aggregations.get("balanceAvg");
     System.out.println("平均薪资: " + balanceAvg1.getValue());
 }

在这里插入图片描述
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐