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