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

    }

 

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