|
@ -1,13 +1,33 @@
|
|
|
package com.yihu.iot.datainput.service;
|
|
|
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import com.google.gson.JsonArray;
|
|
|
import com.yihu.base.es.config.ElastricSearchHelper;
|
|
|
import com.yihu.base.hbase.HBaseHelper;
|
|
|
import com.yihu.iot.datainput.enums.DataTypeEnum;
|
|
|
import com.yihu.iot.datainput.util.ConstantUtils;
|
|
|
import com.yihu.iot.datainput.util.RowKeyUtils;
|
|
|
import io.searchbox.core.SearchResult;
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
import org.apache.hadoop.hbase.Cell;
|
|
|
import org.apache.hadoop.hbase.client.Result;
|
|
|
import org.apache.hadoop.hbase.util.Bytes;
|
|
|
import org.apache.hadoop.hbase.util.CollectionUtils;
|
|
|
import org.elasticsearch.index.query.*;
|
|
|
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
|
@Component
|
|
|
public class DataSearchService {
|
|
|
|
|
@ -19,17 +39,205 @@ public class DataSearchService {
|
|
|
@Autowired
|
|
|
private HBaseHelper hBaseHelper;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 获取数据
|
|
|
* 拼接es搜索json string
|
|
|
* @param json
|
|
|
* @return
|
|
|
*/
|
|
|
public String getData(String json){
|
|
|
String result = elastricSearchHelper.search(ConstantUtils.esIndex,ConstantUtils.esType,json);
|
|
|
if(null == result){
|
|
|
return "no data";
|
|
|
public static String getQueryString(String json){
|
|
|
JSONObject jsonObject = (JSONObject)JSONObject.parse(json);
|
|
|
//第一层query
|
|
|
JSONObject query = new JSONObject();
|
|
|
//bool层
|
|
|
JSONObject boolQuery = new JSONObject();
|
|
|
// and 还是 or,es中key为and--->must,or--->should
|
|
|
JSONObject mustOrShouldQuery = new JSONObject();
|
|
|
//匹配项,字段-值
|
|
|
JSONArray jsonArray = new JSONArray();
|
|
|
for(String key : jsonObject.keySet()){
|
|
|
|
|
|
//默认为must
|
|
|
if(StringUtils.equalsIgnoreCase("or",key) && StringUtils.equals("or",jsonObject.getString("or"))){
|
|
|
mustOrShouldQuery.put("should",jsonArray);
|
|
|
}else{
|
|
|
mustOrShouldQuery.put("must",jsonArray);
|
|
|
}
|
|
|
|
|
|
//分页用,from表示数据从第几条开始取
|
|
|
if(StringUtils.equalsIgnoreCase("from",key)){
|
|
|
query.put("from",jsonObject.getInteger("from"));
|
|
|
continue;
|
|
|
}
|
|
|
//分页用,size表示获取几条数据
|
|
|
if(StringUtils.equalsIgnoreCase("size",key)){
|
|
|
query.put("size",jsonObject.getInteger("size"));
|
|
|
continue;
|
|
|
}
|
|
|
//排序
|
|
|
if(StringUtils.equalsIgnoreCase("sort",key)){
|
|
|
JSONObject sortJsonObj = (JSONObject)jsonObject.get("sort");
|
|
|
for(String sortKey:sortJsonObj.keySet()){
|
|
|
if(!StringUtils.equalsIgnoreCase("asc",sortJsonObj.getString(sortKey)) && !StringUtils.equalsIgnoreCase("desc",sortJsonObj.getString(sortKey) )){
|
|
|
JSONObject error = new JSONObject();
|
|
|
error.put("error","sort contains bad value !");
|
|
|
return error.toJSONString();
|
|
|
}
|
|
|
}
|
|
|
query.put("sort",sortJsonObj);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
JSONObject matchQuery = new JSONObject();
|
|
|
JSONObject subQuery = new JSONObject();
|
|
|
String baseName = DataTypeEnum.body_sign_params.name().toString();
|
|
|
if(null != DataStandardConvertService.dataMap.get(baseName) && DataStandardConvertService.dataMap.get(baseName).contains(key) || StringUtils.equalsIgnoreCase("rid",key)){
|
|
|
subQuery.put("data."+key,jsonObject.get(key)); //data数据里内嵌的字段,真正的数据值内容
|
|
|
}else{
|
|
|
subQuery.put(key,jsonObject.get(key));
|
|
|
}
|
|
|
matchQuery.put("match",subQuery);
|
|
|
jsonArray.add(matchQuery);
|
|
|
}
|
|
|
return result;
|
|
|
|
|
|
boolQuery.put("bool",mustOrShouldQuery);
|
|
|
query.put("query",boolQuery);
|
|
|
|
|
|
return query.toJSONString();
|
|
|
}
|
|
|
|
|
|
public String getData(String jsonData,int page, int size){
|
|
|
// String query = getQueryString(jsonData);
|
|
|
JSONObject resultJsonObj = new JSONObject();
|
|
|
JSONArray resultArray = new JSONArray();
|
|
|
List list = new ArrayList();
|
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
|
|
try {
|
|
|
list = objectMapper.readValue(jsonData,(List.class));
|
|
|
} catch (IOException e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
SearchSourceBuilder query = getQueryBuilder(list,page,size);
|
|
|
SearchResult esResult = elastricSearchHelper.search(ConstantUtils.esIndex,ConstantUtils.esType,query.toString());
|
|
|
if(esResult.getTotal() == 0){
|
|
|
return "";
|
|
|
}
|
|
|
List<String> rowkeys = new ArrayList<>();
|
|
|
for(Object object:esResult.getSourceAsStringList()){
|
|
|
JSONObject jsonObject = (JSONObject)JSONObject.parse(String.valueOf(object));
|
|
|
JSONArray datas = (JSONArray)jsonObject.get("data");
|
|
|
for(Object data:datas){
|
|
|
JSONObject dataJson = (JSONObject)data;
|
|
|
if(null != dataJson.getString("rid")){
|
|
|
rowkeys.add(dataJson.getString("rid"));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if(CollectionUtils.isEmpty(rowkeys)){
|
|
|
resultArray.addAll(esResult.getSourceAsStringList());
|
|
|
resultJsonObj.put("data",resultArray);
|
|
|
resultJsonObj.put("count",esResult.getTotal());
|
|
|
return resultJsonObj.toJSONString();
|
|
|
}
|
|
|
List<Map<String, Object>> resultList = new ArrayList<>();
|
|
|
try {
|
|
|
//拿到rowkey后,去hbase读取数据内容
|
|
|
Result[] hbaseData = hBaseHelper.getResultList(ConstantUtils.tableName,rowkeys);
|
|
|
for(Result res:hbaseData){
|
|
|
List<Cell> ceList = res.listCells();
|
|
|
if(null == ceList){
|
|
|
continue;
|
|
|
}
|
|
|
Map<String, Object> map = new HashMap<String, Object>();
|
|
|
String rowkey = Bytes.toString(res.getRow());
|
|
|
//rowkey是根据一些头部数据加密而来,解密即可还原
|
|
|
String tag = RowKeyUtils.getMessageFromRowKey(rowkey);
|
|
|
String[] tags = tag.split(",");
|
|
|
map.put("access_token", tags[0]);
|
|
|
map.put("sn", tags[1]);
|
|
|
map.put("ext_code", tags[2]);
|
|
|
if (ceList != null && ceList.size() > 0) {
|
|
|
for (Cell cell : ceList) {
|
|
|
map.put(Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()),
|
|
|
Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
|
|
|
}
|
|
|
}
|
|
|
resultList.add(map);
|
|
|
}
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
logger.error("get data from hbase fail.",e.getMessage());
|
|
|
return esResult.getSourceAsString();
|
|
|
}
|
|
|
resultArray.addAll(resultList);
|
|
|
resultJsonObj.put("data",resultArray);
|
|
|
resultJsonObj.put("count",esResult.getTotal());//count放最后最先读出来
|
|
|
return resultJsonObj.toJSONString();
|
|
|
}
|
|
|
|
|
|
private SearchSourceBuilder getQueryBuilder(List<Map<String, Object>> filter,int page, int size) {
|
|
|
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
|
|
|
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
|
|
|
for(Map<String, Object> param : filter) {
|
|
|
String andOr = String.valueOf(param.get("andOr"));
|
|
|
String condition = String.valueOf(param.get("condition"));
|
|
|
String field = String.valueOf(param.get("field"));
|
|
|
Object value = param.get("value");
|
|
|
String baseName = DataTypeEnum.body_sign_params.name().toString();
|
|
|
if(null != DataStandardConvertService.dataMap.get(baseName) && DataStandardConvertService.dataMap.get(baseName).contains(field) || StringUtils.equalsIgnoreCase("id",field)){
|
|
|
field = "data." + field;
|
|
|
}
|
|
|
if(condition.equals("=")) {
|
|
|
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchPhraseQuery(field, value);
|
|
|
if("and".equals(andOr)) {
|
|
|
boolQueryBuilder.must(matchQueryBuilder);
|
|
|
}else if("or".equals(andOr)) {
|
|
|
boolQueryBuilder.should(matchQueryBuilder);
|
|
|
}
|
|
|
}else if (condition.equals("?")) {
|
|
|
QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery(field + ":" + value);
|
|
|
if("and".equals(andOr)) {
|
|
|
boolQueryBuilder.must(queryStringQueryBuilder);
|
|
|
}else if("or".equals(andOr)) {
|
|
|
boolQueryBuilder.should(queryStringQueryBuilder);
|
|
|
}
|
|
|
}else {
|
|
|
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(field);;
|
|
|
if(field.endsWith("Date")) {
|
|
|
rangeQueryBuilder.format("yyyy-MM-dd HH:mm:ss");
|
|
|
}
|
|
|
if(condition.equals(">")) {
|
|
|
rangeQueryBuilder.gt(value);
|
|
|
}else if(condition.equals(">=")) {
|
|
|
rangeQueryBuilder.gte(value);
|
|
|
}else if(condition.equals("<=")) {
|
|
|
rangeQueryBuilder.lte(value);
|
|
|
}else if(condition.equals("<")) {
|
|
|
rangeQueryBuilder.lt(value);
|
|
|
}
|
|
|
if("and".equals(andOr)) {
|
|
|
boolQueryBuilder.must(rangeQueryBuilder);
|
|
|
}else if("or".equals(andOr)) {
|
|
|
boolQueryBuilder.should(rangeQueryBuilder);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
searchSourceBuilder.query(boolQueryBuilder);
|
|
|
searchSourceBuilder.from((page -1)*size);
|
|
|
searchSourceBuilder.size(size);
|
|
|
return searchSourceBuilder;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 修改
|
|
|
* @param json
|
|
|
* @return
|
|
|
*/
|
|
|
public String updateFiled(String json){
|
|
|
return "success";
|
|
|
}
|
|
|
public static void main(String args[]) {
|
|
|
}
|
|
|
}
|