java 操作es实例

本文详细介绍了如何使用Elasticsearch进行高可用的日志管理系统配置,包括客户端连接配置、批量数据插入、数据检索及更新策略。通过具体代码示例,展示了如何处理日志数据的高效读写,确保数据的完整性和一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.kyexpress.common.syslog.provider.es;

import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
*

  • @author 160332

*/
@Component
public class EsConfig {
private static final Logger logger = LoggerFactory.getLogger(EsConfig.class);
@Value("${elasticsearch.clients.cluster-default.clusterNodes}")
private String clusterNodes;
private String schema = “http”;
private int connectTimeOut = 3000;
private int socketTimeOut = 60000;
private int connectionRequestTimeOut = 600;
private int maxConnectNum = 200;
private int maxConnectPerRoute = 200;
private HttpHost httpHost;
private boolean uniqueConnectTimeConfig = true;
private boolean uniqueConnectNumConfig = true;
private RestClientBuilder builder;
private RestHighLevelClient client;

/**
 * Bean name default 函数名字
 *
 * @return
 */
@Bean(autowire = Autowire.BY_NAME, name = "commonClinet")
public RestHighLevelClient client() {
	logger.info("init client");
	if (!StringUtils.isEmpty(clusterNodes)) {
		try {
			String[] ips = clusterNodes.split(",");
			for (int i = 0; i < ips.length; i++) {
				String ip = ips[i];
				String host = ip.split(":")[0];
				int port = Integer.parseInt(ip.split(":")[1]);
				httpHost = new HttpHost(host, port, schema);
				builder = RestClient.builder(httpHost);
				if (uniqueConnectTimeConfig) {
					setConnectTimeOutConfig();
				}
				if (uniqueConnectNumConfig) {
					setMutiConnectConfig();
				}
				client = new RestHighLevelClient(builder);
				break;
			}
			logger.info("end client");
		} catch (Exception e) {
			logger.error("elasticsearch TransportClient create error!!", e);
		}
	}
	return client;
}

/**
 * 异步httpclient的连接延时配置
 */
public void setConnectTimeOutConfig() {
	builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
		@Override
		public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
			requestConfigBuilder.setConnectTimeout(connectTimeOut);
			requestConfigBuilder.setSocketTimeout(socketTimeOut);
			requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
			return requestConfigBuilder;
		}
	});
}

/**
 * 异步httpclient的连接数配置
 */
public void setMutiConnectConfig() {
	builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
		@Override
		public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
			httpClientBuilder.setMaxConnTotal(maxConnectNum);
			httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
			return httpClientBuilder;
		}
	});
}

/**
 * 关闭连接
 */
public void close() {
	if (client != null) {
		try {
			client.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

}

package com.kyexpress.common.syslog.provider.es;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.nio.entity.NStringEntity;
import org.elasticsearch.action.bulk.BulkItemResponse;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.WriteRequest.RefreshPolicy;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.google.common.collect.Lists;
import com.kyexpress.common.syslog.api.model.bo.SysUserOperateLogBO;
import com.kyexpress.common.syslog.api.model.bo.SysUserOperateLogEsBO;
import com.kyexpress.common.syslog.api.model.bo.UserOperateLogBO;
import com.kyexpress.common.syslog.api.model.bo.UserOperateLogEsBO;
import com.kyexpress.common.syslog.api.model.mongo.UserOperateLog;
import com.kyexpress.common.syslog.api.model.vo.KafkaMessageVo;
import com.kyexpress.common.syslog.api.model.vo.SysUserOperateLogEsVo;
import com.kyexpress.common.syslog.api.model.vo.SysUserOperateLogVo;
import com.kyexpress.common.syslog.api.model.vo.UserOperateLogEsVo;
import com.kyexpress.common.syslog.api.model.vo.UserOperateLogVo;
import com.kyexpress.common.syslog.provider.constant.Constants;
import com.kyexpress.framework.model.GenericQuery;
import com.kyexpress.framework.model.Pagination;
import com.kyexpress.framework.model.ResponseData;

@Service
public class ElasticsearchHightService {
private final Logger logger = LoggerFactory.getLogger(ElasticsearchHightService.class);

/**
 * 子索引
 */
private static String SYS_INDEX_DETAIL = "sys_user_operate_log_detail";

/**
 * 主索引
 */
private static String BASE_INDEX_DATA = "base_user_operate_log_data";

/**
 * 类型
 */
private static String INDEX_TYPE = "_doc";

private static ObjectMapper objectMapper;

@Autowired
RestHighLevelClient commonClinet;

private static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

static {
	// 把数据批量写入到数据库表中
	objectMapper = new ObjectMapper();
	// 转换为格式化的json
	objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
	// 如果json中有新增的字段并且是实体类类中不存在的,不报错
	objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
	// 过滤属性为空的字段
	objectMapper.setSerializationInclusion(Include.NON_NULL);
}

/**
 * 比对结果表插入es
 * 
 * @param compareResults
 */
public void insertBacthBaseUserOperateLog(KafkaMessageVo messageVo) {
	UserOperateLog sysLog = messageVo.getBaseDataLog();
	// 如果dataId为空,就丢掉
	if (StringUtils.isBlank(sysLog.getDataId())) {
		return;
	}
	String esId = sysLog.getMasterId().concat("_").concat(sysLog.getTraceId());
	UserOperateLogVo obj = srcObject2DestObject(sysLog);
	try {
		BulkRequest request = new BulkRequest();
		// request.setRefreshPolicy(RefreshPolicy.IMMEDIATE);
		IndexRequest indexRequest = null;
		indexRequest = new IndexRequest(BASE_INDEX_DATA, INDEX_TYPE, esId)
				.source(objectMapper.writeValueAsString(obj), XContentType.JSON);
		request.add(indexRequest).setRefreshPolicy(RefreshPolicy.IMMEDIATE);
		while (true) {
			try {
				BulkResponse resp = commonClinet.bulk(request);
				// 更新子表信息
				updateEsOperateLogDetailByMasterIdAndTraceId(sysLog.getMasterId(), sysLog.getTraceId(), obj);
				break;
			} catch (Throwable e) {
				logger.error("主数据插入es状态{}:", e.getMessage());
				try {
					Thread.sleep(60000L);
				} catch (InterruptedException e1) {
					logger.error(e1.getMessage(), e1);
				}
			}
		}

	} catch (Exception e) {
		logger.error(e.getMessage(), e);
	}
}

private void updateEsOperateLogDetailByMasterIdAndTraceId(String masterId, String traceId, UserOperateLogVo obj) {
	try {
		SearchRequest searchRequest = new SearchRequest(SYS_INDEX_DETAIL);
		searchRequest.types(INDEX_TYPE);
		SearchSourceBuilder srb = new SearchSourceBuilder();
		BoolQueryBuilder bq = QueryBuilders.boolQuery();
		// 根据批次id查询数据
		bq.must(QueryBuilders.termQuery("traceId", traceId));
		bq.must(QueryBuilders.termQuery("masterId", masterId));
		srb.query(bq);
		searchRequest.source(srb);
		try {
			SearchResponse response = commonClinet.search(searchRequest);
			SearchHits hits = response.getHits();
			SearchHit[] searchHists = hits.getHits();
			if (searchHists.length > 0) {
				BulkRequest bulkRequest = new BulkRequest();
				for (SearchHit hit : searchHists) {
					Map<String, Object> hitMap = hit.getSourceAsMap();
					if (null != hitMap) {
						UpdateRequest updateRequest = new UpdateRequest(SYS_INDEX_DETAIL, INDEX_TYPE,
								String.valueOf(hit.getId()));
						updateRequest.docAsUpsert(true);
						updateRequest.retryOnConflict(3);
						updateRequest.doc(objectMapper.writeValueAsString(updateSysUserOperateLogVo(obj)),
								XContentType.JSON);
						bulkRequest.add(updateRequest);
					}
				}
				BulkResponse resp = commonClinet.bulk(bulkRequest);
				logger.info("更新明细es状态{}", resp.hasFailures());
			}
		} catch (Exception ex) {
			logger.error(ex.getMessage(), ex);
		}

	} catch (Exception ex) {
		logger.error(ex.getMessage(), ex);
	}

}

private SysUserOperateLogVo updateSysUserOperateLogVo(UserOperateLogVo obj) {
	SysUserOperateLogVo vo = new SysUserOperateLogVo();
	vo.setBusinessNo(null != obj.getBusinessNo() ? obj.getBusinessNo() : null);
	vo.setCanDelete(null != obj.getCanDelete() ? obj.getCanDelete() : Constants.NO);
	vo.setDepartmentId(null != obj.getDepartmentId() ? obj.getDepartmentId() : null);
	vo.setDepartmentName(null != obj.getDepartmentName() ? obj.getDepartmentName() : null);
	vo.setMasterId(null != obj.getMasterId() ? obj.getMasterId() : null);
	vo.setModuleCode(null != obj.getModuleCode() ? obj.getModuleCode() : null);
	vo.setOperateContent(null != obj.getOperateContent() ? obj.getOperateContent() : null);
	vo.setOperateDevice(null != obj.getOperateDevice() ? obj.getOperateDevice() : null);
	vo.setOperateReason(null != obj.getOperateReason() ? obj.getOperateReason() : null);
	vo.setOperateTime(null != obj.getOperateTime() ? obj.getOperateTime() : null);
	vo.setOperateType(null != obj.getOperateType() ? obj.getOperateType() : null);
	vo.setOperatorId(null != obj.getOperatorId() ? obj.getOperatorId() : null);
	vo.setOperatorName(null != obj.getOperatorName() ? obj.getOperatorName() : null);
	vo.setOperatorNumber(null != obj.getOperatorNumber() ? obj.getOperatorNumber() : null);
	return vo;
}

/**
 * 属性转换
 * 
 * @param obj
 * @return
 */
private UserOperateLogVo srcObject2DestObject(UserOperateLog obj) {
	UserOperateLogVo vo = new UserOperateLogVo();
	vo.setBusinessNo(obj.getBusinessNo());
	vo.setCanDelete(obj.getCanDelete());
	vo.setDataId(obj.getDataId());
	vo.setDepartmentId(obj.getDepartmentId());
	vo.setDepartmentName(obj.getDepartmentName());
	vo.setMasterId(obj.getMasterId());
	vo.setModuleCode(obj.getModuleCode());
	vo.setOperateContent(obj.getOperateContent());
	vo.setOperateDevice(obj.getOperateDevice());
	vo.setOperateIp(null);
	vo.setOperateReason(obj.getOperateReason());
	vo.setOperateTime(null != obj.getOperateTime() ? obj.getOperateTime().getTime() : null);
	vo.setOperateType(obj.getOperateType());
	vo.setOperatorId(obj.getOperatorId());
	vo.setOperatorName(obj.getOperatorName());
	vo.setOperatorNumber(obj.getOperatorNumber());
	vo.setPosition(obj.getPosition());
	vo.setTraceId(obj.getTraceId());
	return vo;

}

public UserOperateLogVo getEsById(String esId) {
	UserOperateLogVo vo = null;
	try {
		SearchRequest searchRequest = new SearchRequest(BASE_INDEX_DATA);
		searchRequest.types(INDEX_TYPE);
		SearchSourceBuilder srb = new SearchSourceBuilder();
		BoolQueryBuilder bq = QueryBuilders.boolQuery();
		// 根据批次id查询数据
		bq.must(QueryBuilders.termQuery("_id", esId));
		srb.query(bq);
		searchRequest.source(srb);
		try {
			SearchResponse response = commonClinet.search(searchRequest);
			SearchHits hits = response.getHits();
			SearchHit[] searchHists = hits.getHits();
			for (SearchHit hit : searchHists) {
				Map<String, Object> hitMap = hit.getSourceAsMap();
				if (null != hitMap) {
					vo = map2Object(hitMap);
				}
				// 只会存在一条数
				break;
			}
		} catch (Exception ex) {
			logger.error(ex.getMessage(), ex);
		}

	} catch (Exception ex) {
		logger.error(ex.getMessage(), ex);
	}
	return vo;
}

private UserOperateLogVo map2Object(Map<String, Object> hitMap) {
	UserOperateLogVo obj = new UserOperateLogVo();
	if (null != hitMap) {
		obj.setBusinessNo(null == hitMap.get("businessNo") ? null : String.valueOf(hitMap.get("businessNo")));
		obj.setCanDelete(null == hitMap.get("canDelete") ? null : String.valueOf(hitMap.get("canDelete")));
		obj.setDataId(null == hitMap.get("dataId") ? null : String.valueOf(hitMap.get("dataId")));
		// obj.setComputerName(null == hitMap.get("computerName") ? null :
		// String.valueOf(hitMap.get("computerName")));
		obj.setDepartmentId(null == hitMap.get("departmentId") ? null : String.valueOf(hitMap.get("departmentId")));
		obj.setDepartmentName(
				null == hitMap.get("departmentName") ? null : String.valueOf(hitMap.get("departmentName")));
		obj.setMasterId(null == hitMap.get("masterId") ? null : String.valueOf(hitMap.get("masterId")));
		obj.setModuleCode(null == hitMap.get("moduleCode") ? null : String.valueOf(hitMap.get("moduleCode")));
		obj.setOperateContent(
				null == hitMap.get("operateContent") ? null : String.valueOf(hitMap.get("operateContent")));
		obj.setOperateDevice(
				null == hitMap.get("operateDevice") ? null : String.valueOf(hitMap.get("operateDevice")));
		// obj.setOperateIp(null == hitMap.get("operateIp") ? null :
		// String.valueOf(hitMap.get("operateIp")));
		obj.setOperateReason(
				null == hitMap.get("operateReason") ? null : String.valueOf(hitMap.get("operateReason")));
		obj.setOperateTime(
				null == hitMap.get("operateTime") ? null : Long.valueOf(String.valueOf(hitMap.get("operateTime"))));
		obj.setOperateType(null == hitMap.get("operateType") ? null : String.valueOf(hitMap.get("operateType")));
		obj.setOperatorId(null == hitMap.get("operatorId") ? null : String.valueOf(hitMap.get("operatorId")));
		obj.setOperatorName(null == hitMap.get("operatorName") ? null : String.valueOf(hitMap.get("operatorName")));
		obj.setOperatorNumber(
				null == hitMap.get("operatorNumber") ? null : String.valueOf(hitMap.get("operatorNumber")));
		obj.setPosition(null == hitMap.get("position") ? null : String.valueOf(hitMap.get("position")));
		obj.setTraceId(null == hitMap.get("traceId") ? null : String.valueOf(hitMap.get("traceId")));
	}
	return obj;
}

public void inserSysUserOperateLog(List<SysUserOperateLogVo> lists, List<SysUserOperateLogVo> refreshbatchInserts) {
	// 查询到主日志就直接插入明细日志
	insertSysUserLog(lists);
	// 如果查询不到主日志,就插入明细日志且强制刷新到es
	insertrefresSysUserLog(refreshbatchInserts);
}

private void insertSysUserLog(List<SysUserOperateLogVo> lists) {
	BulkRequest request = new BulkRequest();
	try {
		for (SysUserOperateLogVo obj : lists) {
			IndexRequest indexRequest = null;
			indexRequest = new IndexRequest(SYS_INDEX_DETAIL, INDEX_TYPE)
					.source(objectMapper.writeValueAsString(obj), XContentType.JSON);
			request.add(indexRequest);
		}
		while (true) {
			try {
				commonClinet.bulk(request);
				break;
			} catch (Throwable e) {
				e.printStackTrace();
				logger.info("插入明细日志失败,失败原因", e.getMessage());
				try {
					Thread.sleep(60000L);
				} catch (InterruptedException e1) {
					logger.error(e1.getMessage(), e1);
				}
			}
		}

	} catch (Exception e) {
		e.printStackTrace();
		logger.error(e.getMessage(), e);
	}
}

private void insertrefresSysUserLog(List<SysUserOperateLogVo> refreshbatchInserts) {
	if (refreshbatchInserts.size() > 0) {
		BulkRequest request = new BulkRequest();
		try {
			for (SysUserOperateLogVo obj : refreshbatchInserts) {
				IndexRequest indexRequest = null;
				indexRequest = new IndexRequest(SYS_INDEX_DETAIL, INDEX_TYPE)
						.source(objectMapper.writeValueAsString(obj), XContentType.JSON);
				request.add(indexRequest);
			}
			// 刷新完数据再结束请求
			request.setRefreshPolicy(RefreshPolicy.IMMEDIATE);
			while (true) {
				try {
					BulkResponse resp = commonClinet.bulk(request);
					BulkItemResponse[] items = resp.getItems();
					for(BulkItemResponse item:items){
						
					}
					break;
				} catch (Throwable e) {
					logger.info("插入明细日志失败,失败原因", e.getMessage());
					try {
						Thread.sleep(60000L);
					} catch (InterruptedException e1) {
						logger.error(e1.getMessage(), e1);
					}
				}
			}

		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		}

	}
}

public List<String> getModuleCodesByBusinessNo(String businessNo) {
	List<String> moduleCodes = Lists.newArrayList();
	try {
		SearchRequest searchRequest = new SearchRequest(BASE_INDEX_DATA);
		searchRequest.types(INDEX_TYPE);
		SearchSourceBuilder srb = new SearchSourceBuilder();
		BoolQueryBuilder bq = QueryBuilders.boolQuery();
		// 根据批次id查询数据
		bq.must(QueryBuilders.termQuery("businessNo", businessNo));
		srb.query(bq);
		searchRequest.source(srb);
		try {
			SearchResponse response = commonClinet.search(searchRequest);
			SearchHits hits = response.getHits();
			SearchHit[] searchHists = hits.getHits();
			for (SearchHit hit : searchHists) {
				Map<String, Object> hitMap = hit.getSourceAsMap();
				if (null != hitMap) {
					if (null != hitMap.get("moduleCode")
							&& StringUtils.isNotBlank(String.valueOf(hitMap.get("moduleCode")))) {
						moduleCodes.add(String.valueOf(hitMap.get("moduleCode")));
					}
				}
			}
		} catch (Exception ex) {
			logger.error("error:{}", ex);
		}

	} catch (Exception ex) {
		logger.error("error:{}", ex);
	}
	moduleCodes = moduleCodes.stream().distinct().collect(Collectors.toList());
	return moduleCodes;
}

/**
 * 分页获取主日志信息
 * 
 * @param
 * @return
 */
public ResponseData<Pagination> getBaseUserOperateLogData(UserOperateLogBO param) {
	ResponseData<Pagination> result = new ResponseData<>();
	Pagination<UserOperateLogEsBO> pagination = new Pagination<>();
	List<UserOperateLogEsBO> lists = new ArrayList<>();
	try {
		SearchRequest searchRequest = new SearchRequest(BASE_INDEX_DATA);
		searchRequest.types(INDEX_TYPE);
		SearchSourceBuilder srb = new SearchSourceBuilder();
		// 继续拼接where条件
		Integer offset = (param.getPage() - 1) * param.getPageSize();
		srb.from(offset).size(param.getPageSize());
		BoolQueryBuilder bq = QueryBuilders.boolQuery();
		List<GenericQuery> querys = param.getGeneric().getVos();
		for (GenericQuery query : querys) {
			if ("moduleCode".equals(query.getPropertyName())) {
				bq.must(QueryBuilders.termQuery("moduleCode", query.getValues().get(0)));
			}
			// 业务编号
			if ("businessNo".equals(query.getPropertyName())) {
				bq.must(QueryBuilders.termQuery("businessNo", query.getValues().get(0)));
			}
			// 操作时间
			if ("operateTimeFrom".equals(query.getPropertyName())) {
				Date dt1 = df.parse(query.getValues().get(0));
				Date dt2 = df.parse(query.getValues().get(1));
				bq.must(QueryBuilders.rangeQuery("operateTime").gte(dt1.getTime()).lte(dt2.getTime()));
			}
			// 操作人
			if ("operatorName".equals(query.getPropertyName())) {
				bq.must(QueryBuilders.termQuery("operatorName", query.getValues().get(0)));
			}
		}
		srb.query(bq).sort("operateTime", SortOrder.DESC);
		;
		searchRequest.source(srb);
		try {
			SearchResponse response = commonClinet.search(searchRequest);
			SearchHits hits = response.getHits();
			SearchHit[] searchHists = hits.getHits();
			UserOperateLogEsVo obj = null;
			for (SearchHit hit : searchHists) {
				obj = new UserOperateLogEsVo();
				Map<String, Object> hitMap = hit.getSourceAsMap();
				obj = objectMapper.convertValue(hitMap, UserOperateLogEsVo.class);
				if (null != hitMap.get("operateTime")
						&& StringUtils.isNotBlank(String.valueOf(hitMap.get("operateTime")))) {
					obj.setOperateTime(dateLong2String(String.valueOf(hitMap.get("operateTime"))));
				}
				// obj.setBusinessNo(
				// null == hitMap.get("businessNo") ? null :
				// String.valueOf(hitMap.get("businessNo")));
				// obj.setOperateType(
				// null == hitMap.get("operateType") ? null :
				// String.valueOf(hitMap.get("operateType")));
				// obj.setOperateContent(
				// null == hitMap.get("operateContent") ? null :
				// String.valueOf(hitMap.get("operateContent")));
				// obj.setOperatorNumber(
				// null == hitMap.get("operatorNumber") ? null :
				// String.valueOf(hitMap.get("operatorNumber")));
				// obj.setOperatorName(
				// null == hitMap.get("operatorName") ? null :
				// String.valueOf(hitMap.get("operatorName")));
				// if (null != hitMap.get("operateTime")
				// &&
				// StringUtils.isNotBlank(String.valueOf(hitMap.get("operateTime"))))
				// {
				// obj.setOperateTime(dateLong2String(String.valueOf(hitMap.get("operateTime"))));
				// }
				// obj.setOperateDevice(
				// null == hitMap.get("operateDevice") ? null :
				// String.valueOf(hitMap.get("operateDevice")));
				//
				// 因为排除了operaTime字段,所以这里换个对象输出
				UserOperateLogEsBO vo = new UserOperateLogEsBO();
				BeanUtils.copyProperties(vo, obj);
				lists.add(vo);
			}
			pagination.setRowTotal((int) hits.totalHits);
		} catch (Exception ex) {
			logger.error("error:{}", ex);
			pagination.setRowTotal(0);
		}
		pagination.setRows(lists);
		pagination.setPageSize(param.getPageSize());
		pagination.setPage(param.getPage());
		result.setData(pagination).ok();
	} catch (Exception ex) {
		logger.error("error:{}", ex);
	}
	return result;
}

/**
 * 
 * @param
 * @return
 */
public ResponseData<Pagination> getSysUserOperateLogDetail(SysUserOperateLogBO param) {
	ResponseData<Pagination> result = new ResponseData<>();
	Pagination<SysUserOperateLogEsBO> pagination = new Pagination<>();
	List<SysUserOperateLogEsBO> lists = new ArrayList<>();
	try {
		SearchRequest searchRequest = new SearchRequest(SYS_INDEX_DETAIL);
		searchRequest.types(INDEX_TYPE);
		SearchSourceBuilder srb = new SearchSourceBuilder();
		// 继续拼接where条件
		Integer offset = (param.getPage() - 1) * param.getPageSize();
		srb.from(offset).size(param.getPageSize());
		BoolQueryBuilder bq = QueryBuilders.boolQuery();
		List<GenericQuery> querys = param.getGeneric().getVos();
		for (GenericQuery query : querys) {
			if ("moduleCode".equals(query.getPropertyName())) {
				bq.must(QueryBuilders.termQuery("moduleCode", query.getValues().get(0)));
			}
			// 业务编号
			if ("businessNo".equals(query.getPropertyName())) {
				bq.must(QueryBuilders.termQuery("businessNo", query.getValues().get(0)));
			}
			// 操作时间
			if ("operateTimeFrom".equals(query.getPropertyName())) {
				Date dt1 = df.parse(query.getValues().get(0));
				Date dt2 = df.parse(query.getValues().get(1));
				bq.must(QueryBuilders.rangeQuery("operateTime").gte(dt1.getTime()).lte(dt2.getTime()));
			}
			// 操作人
			if ("operatorName".equals(query.getPropertyName())) {
				bq.must(QueryBuilders.termQuery("operatorName", query.getValues().get(0)));
			}
		}
		srb.query(bq).sort("operateTime", SortOrder.DESC);
		searchRequest.source(srb);
		try {
			SearchResponse response = commonClinet.search(searchRequest);
			SearchHits hits = response.getHits();
			SearchHit[] searchHists = hits.getHits();
			SysUserOperateLogEsVo obj = null;
			for (SearchHit hit : searchHists) {
				obj = new SysUserOperateLogEsVo();
				Map<String, Object> hitMap = hit.getSourceAsMap();
				obj = objectMapper.convertValue(hitMap, SysUserOperateLogEsVo.class);
				if (null != hitMap.get("operateTime")
						&& StringUtils.isNotBlank(String.valueOf(hitMap.get("operateTime")))) {
					obj.setOperateTime(dateLong2String(String.valueOf(hitMap.get("operateTime"))));
				}
				obj.setId(hit.getId());

				// // 修改后的值
				// obj.setAfterValue(
				// null == hitMap.get("afterValue") ? null :
				// String.valueOf(hitMap.get("afterValue")));
				// obj.setAfterValueConvert(null ==
				// hitMap.get("afterValueConvert") ? null
				// : String.valueOf(hitMap.get("afterValueConvert")));
				// // 修改前的值
				// obj.setBeforeValue(
				// null == hitMap.get("beforeValue") ? null :
				// String.valueOf(hitMap.get("beforeValue")));
				// obj.setBeforeValueConvert(null ==
				// hitMap.get("beforeValueConvert") ? null
				// : String.valueOf(hitMap.get("beforeValueConvert")));
				// // 业务编号
				// obj.setBusinessNo(
				// null == hitMap.get("businessNo") ? null :
				// String.valueOf(hitMap.get("businessNo")));
				// obj.setCanDelete(null == hitMap.get("canDelete") ? null :
				// String.valueOf(hitMap.get("canDelete")));
				// // 子表业务编号
				// obj.setChildBusinessNo(null ==
				// hitMap.get("childBusinessNo") ? null
				// : String.valueOf(hitMap.get("childBusinessNo")));
				// obj.setDataId(null == hitMap.get("dataId") ? null :
				// String.valueOf(hitMap.get("dataId")));
				// if (null != hitMap.get("dataModifyTime")) {
				// if
				// (StringUtils.isNotBlank(String.valueOf(hitMap.get("dataModifyTime"))))
				// {
				// obj.setDataModifyTime(null ==
				// hitMap.get("dataModifyTime") ? 0L
				// :
				// Long.valueOf(String.valueOf(hitMap.get("dataModifyTime"))));
				// }
				// }
				// // 操作类型
				// obj.setOperateType(
				// null == hitMap.get("operateType") ? null :
				// String.valueOf(hitMap.get("operateType")));
				// obj.setDepartmentId(
				// null == hitMap.get("departmentId") ? null :
				// String.valueOf(hitMap.get("departmentId")));
				// obj.setDepartmentName(
				// null == hitMap.get("departmentName") ? null :
				// String.valueOf(hitMap.get("departmentName")));
				// // 业务实体描述
				// obj.setEntityComment(
				// null == hitMap.get("entityComment") ? null :
				// String.valueOf(hitMap.get("entityComment")));
				// obj.setEntityName(
				// null == hitMap.get("entityName") ? null :
				// String.valueOf(hitMap.get("entityName")));
				// // 字段名称
				// obj.setFieldName(null == hitMap.get("fieldName") ? null :
				// String.valueOf(hitMap.get("fieldName")));
				//
				// obj.setFieldComment(
				// null == hitMap.get("fieldComment") ? null :
				// String.valueOf(hitMap.get("fieldComment")));
				// obj.setMasterId(null == hitMap.get("masterId") ? null :
				// String.valueOf(hitMap.get("masterId")));
				// obj.setModuleCode(
				// null == hitMap.get("moduleCode") ? null :
				// String.valueOf(hitMap.get("moduleCode")));
				//
				// // 操作内容
				// obj.setOperateContent(
				// null == hitMap.get("operateContent") ? null :
				// String.valueOf(hitMap.get("operateContent")));
				// // 操作设备
				// obj.setOperateDevice(
				// null == hitMap.get("operateDevice") ? null :
				// String.valueOf(hitMap.get("operateDevice")));
				// obj.setOperateReason(
				// null == hitMap.get("operateReason") ? null :
				// String.valueOf(hitMap.get("operateReason")));
				// if (null != hitMap.get("operateTime")
				// &&
				// StringUtils.isNotBlank(String.valueOf(hitMap.get("operateTime"))))
				// {
				// obj.setOperateTime(dateLong2String(String.valueOf(hitMap.get("operateTime"))));
				// }
				//
				// // 操作人工号
				// obj.setOperatorNumber(
				// null == hitMap.get("operatorNumber") ? null :
				// String.valueOf(hitMap.get("operatorNumber")));
				// // 操作人
				// obj.setOperatorName(
				// null == hitMap.get("operatorName") ? null :
				// String.valueOf(hitMap.get("operatorName")));

				// 因为排除了operaTime字段,所以这里换个对象输出
				SysUserOperateLogEsBO vo = new SysUserOperateLogEsBO();
				BeanUtils.copyProperties(vo, obj);
				lists.add(vo);
			}
			pagination.setRowTotal((int) hits.totalHits);
		} catch (Exception ex) {
			logger.error("error:{}", ex);
			pagination.setRowTotal(0);
		}
		pagination.setRows(lists);
		pagination.setPageSize(param.getPageSize());
		pagination.setPage(param.getPage());
		result.setData(pagination).ok();
	} catch (Exception ex) {
		logger.error("error:{}", ex);
	}
	return result;
}

private String dateLong2String(String time) {
	try {
		Date date = new Date();
		date.setTime(Long.valueOf(time));
		return df.format(date);
	} catch (Exception e) {
		logger.error(e.getMessage(), e);
	}
	return time;
}

/**
 * 删除无用数据
 * 
 */
public void deleteSysOperaLog(String canDeleteValue, Long time) {
	try {
		String method = "POST";
		String endpoint = "/" + SYS_INDEX_DETAIL + "/_delete_by_query?conflicts=proceed&wait_for_completion=false";
		HttpEntity entity = new NStringEntity("{\n" + "\"query\": {\n" + "\"bool\": {\n" + "\"must\": [\n" + "{\n"
				+ "\"term\": {\n" + " \"canDelete\": {\n" + "\"value\": \"" + canDeleteValue + "\"}\n" + "}\n"
				+ "}\n" + ",{\n" + "\"range\": {\n" + "\"operateTime\": {\n" + "\"lt\": " + time + "}\n" + "}\n"
				+ "}\n" + "]\n" + "}\n" + "}\n" + "}", ContentType.APPLICATION_JSON);
		Response response = commonClinet.getLowLevelClient().performRequest(method, endpoint,
				Collections.<String, String> emptyMap(), entity);
		logger.info("删除无效明细日志成功", response.getStatusLine().getStatusCode());
	} catch (IOException e) {
		logger.error("jsonBuild fail:{}", e);
	}
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_43648977

原创

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值