ES查询

前几天项目中需要用的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 {

            // 组装查询条件,构建DSL语句
            SearchSourceBuilder searchSourceBuilder = commonService.buildQueryBaseParam(vehicleBoardParam);
            String dsl = searchSourceBuilder.toString();

            // 执行DSL
            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;
    }
}

// 构建DSL

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

package com.sf.ground.rp.cal.service.helper;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

public class JsonHelper {
    private static final Logger logger = LoggerFactory.getLogger(JsonHelper.class);

    private static ObjectMapper mapper;
    static {
        mapper = new ObjectMapper();
        //去掉默认的时间戳格式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        //设置为中国上海时区
        mapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
        //空值不序列化
//        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        //反序列化时,属性不存在的兼容处理
        mapper.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        //序列化时,日期的统一格式
        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        //单引号处理
        mapper.configure(com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
    }

    public static String toJson(Object obj) {
        if (obj == null) {
            return "";
        }
        try {
            return mapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            logger.error("JSONUtils to String error!", e);
        }
        return "";
    }

    public static <T> T fromJson(String json, Class<T> clazz) {
        try {
            return mapper.readValue(json, clazz);
        } catch (IOException e) {
            logger.error("JSONUtils fromJson error!", e);
        }
        return null;
    }

    public static <T> T fromJson(String json, TypeReference typeReference) {
        try {
            return mapper.readValue(json, typeReference);
        } catch (IOException e) {
            logger.error("JSONUtils fromJson error!", e);
        }
        return null;
    }

    public static void main(String[] args){

    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值