第一章第十九节:Elasticsearch之API查询操作

package com.applesnt.onlinemall.search;

import com.alibaba.fastjson.JSON;
import com.applesnt.onlinemall.search.config.ElasticSearchConfig;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
import org.apache.lucene.search.TotalHits;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.metrics.Avg;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class OnlinemallSearchApplicationTests {

    /*注入es操作对象*/
    @Autowired
    private RestHighLevelClient client;
    
    /*创建一个实体类,封装返回的数据*/
    @Data
    @ToString
    static public class BankVo{
        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 {
        /*创建索引请求*/
        SearchRequest searchRequest = new SearchRequest();
        /*指定从哪个索引进行检索*/
        searchRequest.indices("bank");
        /*构造检索条件*/
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        /*
        构造的条件:
        GET /bank/_search
        {
          "query": {
            "match": {
              "address": "mill"
            }
          },
          "aggs": {
            "ageagg": {
              "terms": {
                "field": "age",
                "size": 10
              }
            },
            "balanceavg":{
              "avg": {
                "field": "balance"
              }
            }
          }
        }
        * */
        //match查询
        sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
        //聚合查询 查询年龄的分布
        sourceBuilder.aggregation(AggregationBuilders.terms("ageagg").field("age").size(10));
        //聚合查询 查询平均薪资
        sourceBuilder.aggregation(AggregationBuilders.avg("balanceavg").field("balance"));

        System.out.println("查询条件:"+sourceBuilder.toString());
        searchRequest.source(sourceBuilder);

        /*执行查询*/
        SearchResponse searchResponse = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);
        System.out.println("响应数据"+searchResponse.toString());
        /*查询命中的数据 获取外层最大的hits*/
        SearchHits hits = searchResponse.getHits();
        //得到总记录数
        TotalHits totalHits = hits.getTotalHits();
        System.out.println("总记录数为:"+totalHits.value);

        //获取文档数据
        SearchHit[] docHits = hits.getHits();
        for (SearchHit docHit : docHits) {
            String id = docHit.getId();
            System.out.println("id = "+id);
            String sourceAsString = docHit.getSourceAsString();
            BankVo bankVo = JSON.parseObject(sourceAsString, BankVo.class);
            System.out.println("文档数据:"+bankVo.toString());
        }

        //获取聚合数据
        Aggregations aggregations = searchResponse.getAggregations();
        Terms ageagg1 = aggregations.get("ageagg");
        List<? extends Terms.Bucket> buckets = ageagg1.getBuckets();
        for (Terms.Bucket bucket : buckets) {
            System.out.println("年龄:"+bucket.getKeyAsString());
            System.out.println("数量:"+bucket.getDocCount());
        }

        Avg balanceavg = aggregations.get("balanceavg");
        System.out.println("平均薪资为:"+balanceavg.getValueAsString());
    }
}

posted @ 2021-07-04 14:42  努力的校长  阅读(136)  评论(0编辑  收藏  举报