ElasticSearch (五)Java之Elasticsearch RestHighLevelClient 基础API与函数,分组查询使用

本章通过ElasticSearch进行查询

must  多个查询条件的完全匹配,相当于 and。
mustNot  多个查询条件的相反匹配,相当于 not。
should  至少有一个查询条件匹配, 相当于 or。

1.创建查询类

  1.1 根据系统id进行查询

@Slf4j
@Repository
public class ESDao {

    
    @Autowired
    private RestHighLevelClient restHighLevelClient;


    /**
     * 根据系统id查询出记录
     * select * from user where id=""
     *
     * @param id
     * @return
     */
    public User selectById(String id) {
        try {
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
            QueryBuilder ids = QueryBuilders.termQuery("id", id);
            boolQueryBuilder.must(ids);
            searchSourceBuilder.size(1);
            searchSourceBuilder.query(boolQueryBuilder);
            SearchRequest searchRequest = new SearchRequest(User.USER_INDEX, User.USER_INDEX).source(searchSourceBuilder);
            log.info("selectById {}", FastJSONUtil.setJsonString(searchRequest.toString()));
            SearchResponse response = restHighLevelClient.search(searchRequest);
            SearchHit[] hits = response.getHits().getHits();
            String sourceAsString = hits[0].getSourceAsString();
            return FastJSONUtil.parsePojo(sourceAsString, User.class);


        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

}

1.2 根据索引查询全部数据

  /**
     * select * from user
     *
     * @return
     */
    public List<User> selectAll() {
        try {
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
            searchSourceBuilder.query(queryBuilder);
            SearchRequest searchRequest = new SearchRequest(User.USER_INDEX, User.USER_INDEX).source(searchSourceBuilder);
            SearchResponse response = restHighLevelClient.search(searchRequest);
            SearchHit[] hits = response.getHits().getHits();
            List<User> users = new ArrayList<>();
            for (SearchHit user : hits) {
                User user1 = FastJSONUtil.parsePojo(user.getSourceAsString(), User.class);
                users.add(user1);
            }
            return users;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

1.3范围查询


    /**
     * 查询年龄大于20 并且不包含与id等于
     * select *from user where age> 20 and id !=123
     *
     * @return List<User>
     */
    public List<User> selectByAge(long age, String id) {
        try {
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
            RangeQueryBuilder contentRiskResult = QueryBuilders.rangeQuery("age").gt(age);
            QueryBuilder ids = QueryBuilders.termQuery("id", id);
            boolQueryBuilder.must(contentRiskResult).mustNot(ids);
            searchSourceBuilder.query(boolQueryBuilder);
            SearchRequest searchRequest = new SearchRequest(User.USER_INDEX, User.USER_INDEX).source(searchSourceBuilder);
            SearchResponse response = restHighLevelClient.search(searchRequest);
            SearchHit[] hits = response.getHits().getHits();
            List<User> users = new ArrayList<>();
            for (SearchHit user : hits) {
                User user1 = FastJSONUtil.parsePojo(user.getSourceAsString(), User.class);
                users.add(user1);
            }
            return users;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

2.函数使用

2.1 根据条件统计出平均值AVG

/**
     * 统计姓名为张三的 平均年龄
     * select avg(age) age from user where name=张三
     *
     * @return List<User>
     */
    public long countAge(String name) {
        try {
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            QueryBuilder names = QueryBuilders.termQuery("name", name);
            AggregationBuilder avgAge = AggregationBuilders.avg("avg_age").field("age");
            searchSourceBuilder.aggregation(avgAge);
            searchSourceBuilder.query(names);
            searchSourceBuilder.size(0);
            SearchRequest searchRequest = new SearchRequest(User.USER_INDEX, User.USER_INDEX).source(searchSourceBuilder);
            SearchResponse response = restHighLevelClient.search(searchRequest);
            ParsedAvg avgAggregationBuilder = response.getAggregations().get("avg_age");
            return (long) avgAggregationBuilder.value();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

2.2 根据条件求和SUM

/**
     * 统计姓名为张三的 年龄总和
     * select sum(age) age from user where name=张三
     *
     * @return List<User>
     */
    public long sumAge(String name) {
        try {
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            QueryBuilder names = QueryBuilders.termQuery("name", name);
            AggregationBuilder sumAge = AggregationBuilders.sum("total_sum").field("age");
            searchSourceBuilder.aggregation(sumAge);
            searchSourceBuilder.query(names);
            searchSourceBuilder.size(0);
            SearchRequest searchRequest = new SearchRequest(User.USER_INDEX, User.USER_INDEX).source(searchSourceBuilder);
            SearchResponse response = restHighLevelClient.search(searchRequest);
            ParsedSum.SingleValue avgAggregationBuilder = response.getAggregations().get("avg_age");
            return (long) avgAggregationBuilder.value();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

 2.3 求出最小值 

  /**
     * 求出最小值
     * select min(*)
     *
     * @param field
     * @return
     */
    private AggregationBuilder min(String field) {
        return AggregationBuilders.min("min").field(field);
    }

2.4 求出最大值

/**
     * 求出最大值
     * select min(*)
     *
     * @param field
     * @return
     */
    private AggregationBuilder max(String field) {
        return AggregationBuilders.max("max").field(field);
    }

 2.5Count统计个数

  /**
     * count统计个数
     *
     * @param field
     * @return
     */
    private ValueCountAggregationBuilder count(String field) {
        return AggregationBuilders.count("count_name").field(field);

    }

3.分组查询 AggregationBuilders.terms("分组之后的名称").field("要分组的名称");


    public void teram() {
        try {
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            //根据姓名进行分组统计个数
            TermsAggregationBuilder field = AggregationBuilders.terms("terms_name").field("name");
            ValueCountAggregationBuilder countField = AggregationBuilders.count("count_name").field("name");
            field.subAggregation(countField);
            searchSourceBuilder.aggregation(field);
            SearchRequest searchRequest = new SearchRequest(User.USER_INDEX, User.USER_INDEX).source(searchSourceBuilder);
            SearchResponse response = restHighLevelClient.search(searchRequest);
            //分组在es中是分桶
            ParsedStringTerms termsName = response.getAggregations().get("terms_name");
            List<? extends Terms.Bucket> buckets = termsName.getBuckets();
            buckets.forEach(naem -> {
                String key = (String) naem.getKey();
                ParsedValueCount countName = naem.getAggregations().get("count_name");
                double value = countName.value();
                log.info("name , count {} {}", key, value);
            });
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章