17.RestClient实现数据聚合功能带过滤条件

 @Override
    public Map> filters(RequestParams param) {
        Map> res = new HashMap<>(3);
        try {
            SearchRequest searchRequest = new SearchRequest("hotel");
            // 构建基本的过滤条件
            FunctionScoreQueryBuilder functionScoreQueryBuilder = buildBasicQuery(param);
            searchRequest.source().query(functionScoreQueryBuilder);

            searchRequest.source().size(0);
            buildAggregation(searchRequest);
            SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
            Aggregations aggregations = response.getAggregations();
            List brandList = getAggByName(aggregations, "brandAgg");
            List cityList = getAggByName(aggregations, "cityAgg");
            List starList = getAggByName(aggregations, "starAgg");
            res.put("城市", cityList);
            res.put("品牌", brandList);
            res.put("星级", starList);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    }

    private List getAggByName(Aggregations aggregations, String aggName) {
        Terms brandAgg = aggregations.get(aggName);
        List brandBuckets = brandAgg.getBuckets();
        List brandList = new ArrayList<>();
        for (Terms.Bucket bucket : brandBuckets) {
            String brand = bucket.getKeyAsString();
            brandList.add(brand);
        }
        return brandList;
    }

    private void buildAggregation(SearchRequest searchRequest) {
        searchRequest.source().aggregation(AggregationBuilders
                .terms("brandAgg").field("brand").size(100));
        searchRequest.source().aggregation(AggregationBuilders
                .terms("cityAgg").field("city").size(100));
        searchRequest.source().aggregation(AggregationBuilders
                .terms("starAgg").field("starName").size(100));
    }

    private FunctionScoreQueryBuilder buildBasicQuery(RequestParams param) {
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        if (StrUtil.isNotBlank(param.getBrand())) {
            boolQueryBuilder.must(QueryBuilders.termQuery("brand", param.getBrand()));
        }
        if (StrUtil.isNotBlank(param.getCity())) {
            boolQueryBuilder.must(QueryBuilders.termQuery("city", param.getCity()));
        }
        if (StrUtil.isNotBlank(param.getStarName())) {
            boolQueryBuilder.must(QueryBuilders.termQuery("starName", param.getStarName()));
        }
        if (ObjUtil.isNotNull(param.getMaxPrice())) {
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").lte(param.getMaxPrice()));
        }
        if (ObjUtil.isNotNull(param.getMinPrice())) {
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(param.getMinPrice()));
        }

        if (StrUtil.isNotBlank(param.getKey())) {
            boolQueryBuilder.must(QueryBuilders.matchQuery("all", param.getKey()));
        } else {
            boolQueryBuilder.must(QueryBuilders.matchAllQuery());
        }

        return functionScoreQueryBuilder;
    }

你可能感兴趣的:(windows)