ES查詢

@Override
    public Page<List<VehicleNested>> searchVehicleBoardByEsPage(VehicleBoardParam vehicleBoardParam) {
        Page<List<VehicleNested>> result = new Page<>();
        result.setPageNum(vehicleBoardParam.getPage());
        result.setPageSize(vehicleBoardParam.getPageSize());
        if (vehicleBoardParam == null) {
            return result;
        }
        try {
            SearchSourceBuilder searchSourceBuilder = commonService.buildQueryBaseParam(vehicleBoardParam);
            String dsl = searchSourceBuilder.toString();
            String resultStr = commonService.dslQuery(dsl);
            EsResponse<VehicleNested> response = JsonHelper.fromJson(resultStr, new TypeReference<EsResponse<VehicleNested>>(){});
            if(response.getSuccess()){
                EsObject<VehicleNested> esObject = response.getObj();
                Long hitNum = esObject.getHitNum();
                if(hitNum == 0){
                    return result;
                }
                // 設置總記錄
                result.setTotal(hitNum.intValue());
                result.setData(esObject.getHits());
            }else{
                result.setTotal(0);
            }
        } catch (Exception e) {
             return result;
        }
         return result;
    }

public class Page<T> {
    private int pageNum;
    private int pageSize;
    private int total;
    private T data;

    public Page(){}

    public Page(int pageNum, int pageSize, int total){
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.total = total;

    }

    public int getPageNum() {
        return pageNum;
    }

    public void setPageNum(int pageNum) {
        this.pageNum = pageNum;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

public class EsObject<T> {
    private Long hitNum;
    private Long returnNum;
    private Long tookTime;
    private List<T> hits;
    private Map<String, EsAggregation> aggregations;

    public Long getHitNum() {
        return hitNum;
    }

    public void setHitNum(Long hitNum) {
        this.hitNum = hitNum;
    }

    public Long getReturnNum() {
        return returnNum;
    }

    public void setReturnNum(Long returnNum) {
        this.returnNum = returnNum;
    }

    public Long getTookTime() {
        return tookTime;
    }

    public void setTookTime(Long tookTime) {
        this.tookTime = tookTime;
    }

    public List<T> getHits() {
        return hits;
    }

    public void setHits(List<T> hits) {
        this.hits = hits;
    }

    public Map<String, EsAggregation> getAggregations() {
        return aggregations;
    }

    public void setAggregations(Map<String, EsAggregation> aggregations) {
        this.aggregations = aggregations;
    }
}

public SearchSourceBuilder buildQueryBaseParam(VehicleBoardParam param) {
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        if(param.getPage() != null && param.getPageSize() != null){
            searchSourceBuilder.size(param.getPageSize());
            searchSourceBuilder.from((param.getPage() - 1) * param.getPageSize());
        }
        buildQueryVehicleBoardParam(searchSourceBuilder, param);
        return searchSourceBuilder;
    }

public void buildQueryVehicleBoardParam(SearchSourceBuilder searchSourceBuilder,VehicleBoardParam param){
        // 獲取配置開關
        String version = PropertiesManager.instance().getString("es.vehicle.model.upgrade.version", "1.0");
        BoolQueryBuilder bool = QueryBuilders.boolQuery();
        //車牌號
        if(CollectionUtils.isNotEmpty(param.getVehicleCodeList())){
            bool.must(QueryBuilders.termsQuery("vehicleCode", param.getVehicleCodeList()));
        }
        // 車輛標籤
        if (StringUtils.isNotBlank(param.getVehicleLabel())) {
            if("OTHER".equals(param.getVehicleLabel())){
                String tagStr = PropertiesManager.instance().getString("vehicle.query.tag.other", "GF,BT,QY,HX,DD");
                if(StringUtils.isNotEmpty(tagStr)){
                    String[] tags = tagStr.split(",");
                    for(String tag : tags){
                        bool.mustNot(QueryBuilders.termQuery("tags", tag));
                    }
                }
            }else{
                bool.must(QueryBuilders.termQuery("tags", param.getVehicleLabel()));
            }
        }
        // 車長
        if (StringUtils.isNotBlank(param.getVehicleLength())) {
            bool.must(QueryBuilders.termQuery("vehicleLength", param.getVehicleLength()));
        }
        // 手機號
        if (StringUtils.isNotBlank(param.getMobilePhone())) {
            bool.must(QueryBuilders.termQuery("driver.mobilephone", param.getMobilePhone()));
        }
        // 任務狀態 1:空閒中  2:任務執行中 3:離線
        if (StringUtils.isNotBlank(param.getVehicleTaskStatus())) {
            if("2".equals(param.getVehicleTaskStatus())){
                bool.must(QueryBuilders.existsQuery("curTask"));
            }else if("1".equals(param.getVehicleTaskStatus())){
                bool.mustNot(QueryBuilders.existsQuery("curTask"));
            }else if("3".equals(param.getVehicleTaskStatus())){ // 當前時間 - 10分鐘 與GPS時間比較
                Date d = new Date();
                long n = d.getTime()-(60*10*1000); // 10 分鐘
                d.setTime(n);
                bool.must(QueryBuilders.rangeQuery("gps.gpsTm").lte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d)));
            }
        }
        // 車隊
        if("1.0".equals(version)){
            if(param.getMotorcadeId() != null){
                bool.must(QueryBuilders.termQuery("motorcade.id", param.getMotorcadeId()));
            }
            if(param.getMotorcadeType() != null){
                bool.must(QueryBuilders.termQuery("motorcade.type", param.getMotorcadeType()));
            }
        }else {
            BoolQueryBuilder motorcadeBoolQueryBuilder = QueryBuilders.boolQuery();
            if(param.getMotorcadeId() != null){
                motorcadeBoolQueryBuilder.must(QueryBuilders.termQuery("motorcades.id", param.getMotorcadeId()));
            }
            if(param.getMotorcadeType() != null){
                motorcadeBoolQueryBuilder.must(QueryBuilders.termQuery("motorcades.type", param.getMotorcadeType()));
            }
            if(param.getMotorcadeId() != null || param.getMotorcadeType() != null){
                QueryBuilder motorcadeQueryBuilder = QueryBuilders.nestedQuery("motorcades", motorcadeBoolQueryBuilder, ScoreMode.Total);
                bool.must(motorcadeQueryBuilder);
            }
        }

        // 招募
        if("1.0".equals(version)){
            if (StringUtils.isNotBlank(param.getRegisterCityCode())) {
                bool.must(QueryBuilders.termQuery("recruit.cityCode", param.getRegisterCityCode()));
            }
            if (StringUtils.isNotBlank(param.getRegisterCityCode())) {
                bool.must(QueryBuilders.termQuery("recruit.cityCode", param.getRegisterCityCode()));
            }
            bool.must(QueryBuilders.rangeQuery("recruit.lineEffectTm").gte(new SimpleDateFormat("yyyy-MM-dd").format(new Date())+" 00:00:00").lte(new SimpleDateFormat("yyyy-MM-dd").format(new Date())+" 23:59:59"));
        }else {
            BoolQueryBuilder recruitsBuilder = QueryBuilders.boolQuery();
            if (StringUtils.isNotBlank(param.getRegisterCityCode())) {
                recruitsBuilder.must(QueryBuilders.termQuery("recruits.cityCode", param.getRegisterCityCode()));
            }
            recruitsBuilder.must(QueryBuilders.rangeQuery("recruits.lineEffectTm").gte(new SimpleDateFormat("yyyy-MM-dd").format(new Date())+" 00:00:00").lte(new SimpleDateFormat("yyyy-MM-dd").format(new Date())+" 23:59:59"));
            QueryBuilder recruitsQueryBuilder = QueryBuilders.nestedQuery("recruits", recruitsBuilder, ScoreMode.Total);
            bool.must(recruitsQueryBuilder);
        }
        searchSourceBuilder.query(QueryBuilders.constantScoreQuery(bool));
    }

 

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