|  | @ -1,36 +1,45 @@
 | 
	
		
			
				|  |  | package com.yihu.iot.datainput.service;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import com.alibaba.fastjson.JSON;
 | 
	
		
			
				|  |  | 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 com.yihu.jw.iot.datainput.Data;
 | 
	
		
			
				|  |  | import com.yihu.jw.iot.datainput.DataBodySignsDO;
 | 
	
		
			
				|  |  | import com.yihu.jw.iot.datainput.DataStandardDO;
 | 
	
		
			
				|  |  | import com.yihu.jw.iot.datainput.StepInfoDO;
 | 
	
		
			
				|  |  | import com.yihu.jw.restmodel.iot.datainput.DataBodySignsVO;
 | 
	
		
			
				|  |  | import com.yihu.jw.restmodel.iot.datainput.WeRunDataVO;
 | 
	
		
			
				|  |  | import com.yihu.jw.util.date.DateUtil;
 | 
	
		
			
				|  |  | import io.searchbox.core.SearchResult;
 | 
	
		
			
				|  |  | import io.searchbox.core.Update;
 | 
	
		
			
				|  |  | 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.apache.lucene.queryparser.xml.FilterBuilder;
 | 
	
		
			
				|  |  | import org.apache.lucene.queryparser.xml.FilterBuilderFactory;
 | 
	
		
			
				|  |  | import org.elasticsearch.index.query.*;
 | 
	
		
			
				|  |  | import org.elasticsearch.search.builder.SearchSourceBuilder;
 | 
	
		
			
				|  |  | import org.elasticsearch.search.sort.FieldSortBuilder;
 | 
	
		
			
				|  |  | import org.elasticsearch.search.sort.SortBuilder;
 | 
	
		
			
				|  |  | import org.elasticsearch.search.sort.SortOrder;
 | 
	
		
			
				|  |  | import org.slf4j.Logger;
 | 
	
		
			
				|  |  | import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  | import org.springframework.beans.BeanUtils;
 | 
	
		
			
				|  |  | import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | import org.springframework.data.elasticsearch.core.query.UpdateQuery;
 | 
	
		
			
				|  |  | import org.springframework.data.elasticsearch.core.query.UpdateQueryBuilder;
 | 
	
		
			
				|  |  | import org.springframework.stereotype.Component;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import javax.annotation.PostConstruct;
 | 
	
		
			
				|  |  | import java.beans.PropertyDescriptor;
 | 
	
		
			
				|  |  | import java.io.IOException;
 | 
	
		
			
				|  |  | import java.util.ArrayList;
 | 
	
		
			
				|  |  | import java.util.HashMap;
 | 
	
		
			
				|  |  | import java.util.List;
 | 
	
		
			
				|  |  | import java.util.Map;
 | 
	
		
			
				|  |  | import java.util.*;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | @Component
 | 
	
		
			
				|  |  | public class DataSearchService {
 | 
	
	
		
			
				|  | @ -43,14 +52,30 @@ public class DataSearchService {
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private HBaseHelper hBaseHelper;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private static Map<String,Set<String>> fieldsMap = new HashMap<>();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @PostConstruct
 | 
	
		
			
				|  |  |     public static void init(){
 | 
	
		
			
				|  |  |         Set<String> fieldsSet = new HashSet<>();
 | 
	
		
			
				|  |  |         PropertyDescriptor[] properties = BeanUtils.getPropertyDescriptors(Data.class);
 | 
	
		
			
				|  |  |         for(PropertyDescriptor field:properties){
 | 
	
		
			
				|  |  |             fieldsSet.add(field.getName());
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         fieldsMap.put("data",fieldsSet);
 | 
	
		
			
				|  |  |         Set<String> fieldsSet2 = new HashSet<>();
 | 
	
		
			
				|  |  |         PropertyDescriptor[] properties2 = BeanUtils.getPropertyDescriptors(StepInfoDO.class);
 | 
	
		
			
				|  |  |         for(PropertyDescriptor field:properties2){
 | 
	
		
			
				|  |  |             fieldsSet2.add(field.getName());
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         fieldsMap.put("stepInfoList",fieldsSet2);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 拼接es搜索json string
 | 
	
		
			
				|  |  |      * @param json
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static String getQueryString(String json){
 | 
	
		
			
				|  |  |         JSONObject jsonObject = (JSONObject)JSONObject.parse(json);
 | 
	
		
			
				|  |  |         JSONObject jsonObject = JSONObject.parseObject(json);
 | 
	
		
			
				|  |  |         //第一层query
 | 
	
		
			
				|  |  |         JSONObject query = new JSONObject();
 | 
	
		
			
				|  |  |         //bool层
 | 
	
	
		
			
				|  | @ -111,17 +136,10 @@ public class DataSearchService {
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public String getData(String jsonData){
 | 
	
		
			
				|  |  | //        String query = getQueryString(jsonData);
 | 
	
		
			
				|  |  |         logger.info("load data from elasticsearch start:" + org.apache.http.client.utils.DateUtils.formatDate(new Date(), DateUtil.yyyy_MM_dd_HH_mm_ss));
 | 
	
		
			
				|  |  |         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(jsonData);
 | 
	
		
			
				|  |  |         SearchSourceBuilder query = getQueryBuilder("data",jsonData);
 | 
	
		
			
				|  |  |         SearchResult esResult = elastricSearchHelper.search(ConstantUtils.esIndex,ConstantUtils.esType,query.toString());
 | 
	
		
			
				|  |  |         if(esResult.getTotal() == 0){
 | 
	
		
			
				|  |  |             return "";
 | 
	
	
		
			
				|  | @ -138,68 +156,122 @@ public class DataSearchService {
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         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放最后最先读出来
 | 
	
		
			
				|  |  |         resultArray.addAll(esResult.getSourceAsStringList());
 | 
	
		
			
				|  |  |         resultJsonObj.put("data", resultArray);
 | 
	
		
			
				|  |  |         resultJsonObj.put("count", esResult.getTotal());
 | 
	
		
			
				|  |  |         logger.info("load data from elasticsearch end:" + org.apache.http.client.utils.DateUtils.formatDate(new Date(), DateUtil.yyyy_MM_dd_HH_mm_ss));
 | 
	
		
			
				|  |  |         return resultJsonObj.toJSONString();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | //        if (!CollectionUtils.isEmpty(rowkeys)) {
 | 
	
		
			
				|  |  | //         return getDataFromHbase(rowkeys,esResult);
 | 
	
		
			
				|  |  | //        }
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     //List<Map<String, Object>> filter,int page, int size,String sort
 | 
	
		
			
				|  |  |     private SearchSourceBuilder getQueryBuilder(String jsonData) {
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 构造es查询参数
 | 
	
		
			
				|  |  |      * @param jsonData
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |              "filter":[{"andOr":"and|or","condition":">|=|<|>=|<=|?","field":"<filed>","value":"<value>"},<{...}>],
 | 
	
		
			
				|  |  |                        - 参数说明:andOr跟数据库的中的AND和OR相似;condition指条件匹配程度,?相当于数据库中的like;filed指检索的字段;value为检索的值
 | 
	
		
			
				|  |  |             "page":1,  - 参数格式:页码,默认1,int类型 不需要分页,传""
 | 
	
		
			
				|  |  |             "size":10, - 参数格式:条数,默认10,int类型 不需要分页,传""
 | 
	
		
			
				|  |  |             "sort":[
 | 
	
		
			
				|  |  |                      {"key":{"order":"asc|desc"}}, - 参数格式:排序, key要排序的字段,order固定,取值asc或desc,不需要排序,传""
 | 
	
		
			
				|  |  |                      {"key":{"order":"asc|desc"}}
 | 
	
		
			
				|  |  |                   ]
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private static SearchSourceBuilder getQueryBuilder(String nestedPath,String jsonData) {
 | 
	
		
			
				|  |  |         JSONObject json = JSONObject.parseObject(jsonData);
 | 
	
		
			
				|  |  |         List<Map<String, Object>> filter = (List)json.getJSONArray("filter");
 | 
	
		
			
				|  |  |         int page = json.getIntValue("page");
 | 
	
		
			
				|  |  |         int size = json.getIntValue("size");
 | 
	
		
			
				|  |  |         int page = json.getIntValue("page") == 0 ? 1:json.getIntValue("page"); //从第一页开始
 | 
	
		
			
				|  |  |         int size = json.getIntValue("size") == 0 ? 1:json.getIntValue("size"); //默认值为1,最少获取一条记录
 | 
	
		
			
				|  |  |         JSONArray sort = json.getJSONArray("sort");
 | 
	
		
			
				|  |  |         SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 | 
	
		
			
				|  |  |         BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         boolQueryBuilder = getBoolQueryBuilder(nestedPath,jsonData,false);//非嵌套的数据查询不需要nested
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         NestedQueryBuilder nestedQueryBuilder = getNestedBuilder(nestedPath,jsonData);//嵌套的数据查询
 | 
	
		
			
				|  |  |         QueryFilterBuilder filterBuilder = QueryBuilders.queryFilter(nestedQueryBuilder);
 | 
	
		
			
				|  |  |         FilteredQueryBuilder filteredQueryBuilder = QueryBuilders.filteredQuery(boolQueryBuilder,filterBuilder);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         searchSourceBuilder.from((page -1)*size);
 | 
	
		
			
				|  |  |         searchSourceBuilder.size(size);
 | 
	
		
			
				|  |  |         //排序
 | 
	
		
			
				|  |  |         if(CollectionUtils.notEmpty(sort)){
 | 
	
		
			
				|  |  |             for(Object obj:sort){
 | 
	
		
			
				|  |  |                 JSONObject object = JSONObject.parseObject(obj.toString());
 | 
	
		
			
				|  |  |                 FieldSortBuilder fieldSortBuilder = null;
 | 
	
		
			
				|  |  |                 for(String key:object.keySet()){
 | 
	
		
			
				|  |  |                     if(!CollectionUtils.isEmpty(fieldsMap.get(nestedPath)) && fieldsMap.get(nestedPath).contains(key)){
 | 
	
		
			
				|  |  |                         fieldSortBuilder = new FieldSortBuilder("data." + key);
 | 
	
		
			
				|  |  |                     }else{
 | 
	
		
			
				|  |  |                         fieldSortBuilder = new FieldSortBuilder(key);
 | 
	
		
			
				|  |  |                     }
 | 
	
		
			
				|  |  |                     JSONObject sortValue = object.getJSONObject(key);
 | 
	
		
			
				|  |  |                     if(StringUtils.equalsIgnoreCase(SortOrder.ASC.toString(),sortValue.getString("order"))){
 | 
	
		
			
				|  |  |                         fieldSortBuilder.order(SortOrder.ASC);
 | 
	
		
			
				|  |  |                     }else if(StringUtils.equalsIgnoreCase(SortOrder.DESC.toString(),sortValue.getString("order"))){
 | 
	
		
			
				|  |  |                         fieldSortBuilder.order(SortOrder.DESC);
 | 
	
		
			
				|  |  |                     }
 | 
	
		
			
				|  |  |                     fieldSortBuilder.setNestedPath("data");
 | 
	
		
			
				|  |  |                     searchSourceBuilder.sort(fieldSortBuilder);
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         searchSourceBuilder.query(filteredQueryBuilder);
 | 
	
		
			
				|  |  |         return searchSourceBuilder;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 嵌套的查询query
 | 
	
		
			
				|  |  |      * @param nestedPath
 | 
	
		
			
				|  |  |      * @param queryCondition
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private static NestedQueryBuilder getNestedBuilder(String nestedPath,String queryCondition){
 | 
	
		
			
				|  |  |         BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
 | 
	
		
			
				|  |  |         boolQueryBuilder = getBoolQueryBuilder(nestedPath,queryCondition,true);
 | 
	
		
			
				|  |  |         NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery(nestedPath,boolQueryBuilder);
 | 
	
		
			
				|  |  |         return nestedQueryBuilder;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 构造bool查询(里面有匹配,过滤,范围等)
 | 
	
		
			
				|  |  |      * @param nestedPath
 | 
	
		
			
				|  |  |      * @param queryCondition
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private static BoolQueryBuilder getBoolQueryBuilder(String nestedPath,String queryCondition,Boolean isNested){
 | 
	
		
			
				|  |  |         BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
 | 
	
		
			
				|  |  |         JSONObject jsonCondition = JSONObject.parseObject(queryCondition);
 | 
	
		
			
				|  |  |         List<Map<String, Object>> filter = (List)jsonCondition.getJSONArray("filter");
 | 
	
		
			
				|  |  |         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("rid",field)){
 | 
	
		
			
				|  |  |                 field = "data." + field;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             if(!isNested){
 | 
	
		
			
				|  |  |                 if(!CollectionUtils.isEmpty(fieldsMap.get(nestedPath)) && fieldsMap.get(nestedPath).contains(field)){
 | 
	
		
			
				|  |  |                     continue;
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |             }else{
 | 
	
		
			
				|  |  |                 if(!CollectionUtils.isEmpty(fieldsMap.get(nestedPath)) && !fieldsMap.get(nestedPath).contains(field)){
 | 
	
		
			
				|  |  |                     continue;
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |                 field = nestedPath + "." + field;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             if(condition.equals("=")) {
 | 
	
		
			
				|  |  |             if(null == condition){
 | 
	
		
			
				|  |  |                 MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchPhraseQuery(field, value);
 | 
	
		
			
				|  |  |                 if(null == andOr) {
 | 
	
		
			
				|  |  |                     boolQueryBuilder.must(matchQueryBuilder);
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |             }else if(condition.equals("=")) {
 | 
	
		
			
				|  |  |                 MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchPhraseQuery(field, value);
 | 
	
		
			
				|  |  |                 if("and".equals(andOr)) {
 | 
	
		
			
				|  |  |                     boolQueryBuilder.must(matchQueryBuilder);
 | 
	
	
		
			
				|  | @ -214,7 +286,7 @@ public class DataSearchService {
 | 
	
		
			
				|  |  |                     boolQueryBuilder.should(queryStringQueryBuilder);
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |             }else {
 | 
	
		
			
				|  |  |                 RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(field);;
 | 
	
		
			
				|  |  |                 RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(field);
 | 
	
		
			
				|  |  |                 if(field.endsWith("Date")) {
 | 
	
		
			
				|  |  |                     rangeQueryBuilder.format("yyyy-MM-dd HH:mm:ss");
 | 
	
		
			
				|  |  |                 }
 | 
	
	
		
			
				|  | @ -234,60 +306,186 @@ public class DataSearchService {
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         searchSourceBuilder.query(boolQueryBuilder);
 | 
	
		
			
				|  |  |         searchSourceBuilder.from((page -1)*size);
 | 
	
		
			
				|  |  |         searchSourceBuilder.size(size);
 | 
	
		
			
				|  |  |         if(CollectionUtils.notEmpty(sort)){
 | 
	
		
			
				|  |  |             for(Object obj:sort){
 | 
	
		
			
				|  |  |                 JSONObject object = JSONObject.parseObject(obj.toString());
 | 
	
		
			
				|  |  |                 for(String key:object.keySet()){
 | 
	
		
			
				|  |  |                     FieldSortBuilder fieldSortBuilder = new FieldSortBuilder(key);
 | 
	
		
			
				|  |  |                     JSONObject sortValue = object.getJSONObject(key);
 | 
	
		
			
				|  |  |                     if(StringUtils.equalsIgnoreCase(SortOrder.ASC.toString(),sortValue.getString("order"))){
 | 
	
		
			
				|  |  |                         fieldSortBuilder.order(SortOrder.ASC);
 | 
	
		
			
				|  |  |                     }else if(StringUtils.equalsIgnoreCase(SortOrder.DESC.toString(),sortValue.getString("order"))){
 | 
	
		
			
				|  |  |                         fieldSortBuilder.order(SortOrder.DESC);
 | 
	
		
			
				|  |  |                     }
 | 
	
		
			
				|  |  |                     searchSourceBuilder.sort(fieldSortBuilder);
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return searchSourceBuilder;
 | 
	
		
			
				|  |  |         return boolQueryBuilder;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 修改
 | 
	
		
			
				|  |  |      * 修改字段
 | 
	
		
			
				|  |  |      * {"rid":"", 要修改的文档data id
 | 
	
		
			
				|  |  |      *  "key":"value", key:要修改的字段,value:要修改的值
 | 
	
		
			
				|  |  |      *  <{...}>}
 | 
	
		
			
				|  |  |      * @param json
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public String updateFiled(String json){
 | 
	
		
			
				|  |  |         return "success";
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  |     public static void main(String args[]) {}
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public String updateData(String json) {
 | 
	
		
			
				|  |  |         JSONObject params = JSONObject.parseObject(json);
 | 
	
		
			
				|  |  |         //拿到rid,构造通用查询结构,查询对应es Id
 | 
	
		
			
				|  |  |         String rid = params.getString("rid");
 | 
	
		
			
				|  |  |         JSONObject queryField = new JSONObject();
 | 
	
		
			
				|  |  |         queryField.put("field","rid");
 | 
	
		
			
				|  |  |         queryField.put("value",rid);
 | 
	
		
			
				|  |  |         JSONArray filter = new JSONArray();
 | 
	
		
			
				|  |  |         filter.add(queryField);
 | 
	
		
			
				|  |  |         JSONObject query = new JSONObject();
 | 
	
		
			
				|  |  |         query.put("filter",filter);
 | 
	
		
			
				|  |  |         SearchSourceBuilder queryString = getQueryBuilder("data",query.toJSONString());
 | 
	
		
			
				|  |  |         JSONArray datas = new JSONArray();
 | 
	
		
			
				|  |  |         JSONObject resultObject = new JSONObject();
 | 
	
		
			
				|  |  |         String _id = "";
 | 
	
		
			
				|  |  |         try {
 | 
	
		
			
				|  |  |             //将该rid的文档取出来
 | 
	
		
			
				|  |  |             SearchResult searchResult = elastricSearchHelper.search(ConstantUtils.esIndex, ConstantUtils.esType, queryString.toString());
 | 
	
		
			
				|  |  |             params.remove("rid");
 | 
	
		
			
				|  |  |             _id = getEsId(searchResult.getJsonString());
 | 
	
		
			
				|  |  |             String resultSource = searchResult.getSourceAsString();
 | 
	
		
			
				|  |  |             //inner,nested object在es中修改只支持替换整个的object
 | 
	
		
			
				|  |  |             resultObject = (JSONObject) JSONObject.parse(String.valueOf(resultSource));
 | 
	
		
			
				|  |  |             //文档里的data数组对象数据
 | 
	
		
			
				|  |  |             datas = (JSONArray) resultObject.get("data");
 | 
	
		
			
				|  |  |             for (Object data : datas) {
 | 
	
		
			
				|  |  |                 JSONObject dataJson = (JSONObject) data;
 | 
	
		
			
				|  |  |                 if (StringUtils.equalsIgnoreCase(rid, dataJson.getString("rid"))) {
 | 
	
		
			
				|  |  |                     for (String key : params.keySet()) {
 | 
	
		
			
				|  |  |                         dataJson.put(key, params.get(key));//改的是data里面的数据
 | 
	
		
			
				|  |  |                     }
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }catch (Exception e){
 | 
	
		
			
				|  |  |             logger.error("get data failed from elasticsearch",e.getMessage());
 | 
	
		
			
				|  |  |             return "no data for rid:"+ rid +",update failed";
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         JSONObject updateObj = new JSONObject();
 | 
	
		
			
				|  |  |         updateObj.put("data",datas);
 | 
	
		
			
				|  |  | //        boolean bool = elastricSearchHelper.update(ConstantUtils.esIndex, ConstantUtils.esType, _id, updateObj.toJSONString());
 | 
	
		
			
				|  |  | //        Update update = new Update();
 | 
	
		
			
				|  |  | //        update.
 | 
	
		
			
				|  |  |         boolean bool = elastricSearchHelper.update(ConstantUtils.esIndex, ConstantUtils.esType, _id, resultObject);
 | 
	
		
			
				|  |  |         return String.valueOf(bool);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private String getEsId(String str){
 | 
	
		
			
				|  |  |         String _id = "";
 | 
	
		
			
				|  |  |         JSONObject jsonObject = JSONObject.parseObject(str);
 | 
	
		
			
				|  |  |         JSONObject hist1 = jsonObject.getJSONObject("hits");
 | 
	
		
			
				|  |  |         JSONArray array = (JSONArray)hist1.get("hits");
 | 
	
		
			
				|  |  |         for(Object obj:array){
 | 
	
		
			
				|  |  |             _id  = ((JSONObject)obj).getString("_id");
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return _id;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 根据从es中搜索出来的结果去hbase中查询数据内容
 | 
	
		
			
				|  |  |      * @param rowkeys
 | 
	
		
			
				|  |  |      * @param esResult
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public String getDataFromHbase(List<String> rowkeys,SearchResult esResult){
 | 
	
		
			
				|  |  |         long time = System.currentTimeMillis();
 | 
	
		
			
				|  |  |         logger.info("load data from hbase start:" + org.apache.http.client.utils.DateUtils.formatDate(new Date(), DateUtil.yyyy_MM_dd_HH_mm_ss));
 | 
	
		
			
				|  |  |         JSONObject resultJsonObj = new JSONObject();
 | 
	
		
			
				|  |  |         JSONArray  resultArray = new JSONArray();
 | 
	
		
			
				|  |  |         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 failed.",e.getMessage());
 | 
	
		
			
				|  |  |             return esResult.getSourceAsString();
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         resultArray.addAll(resultList);
 | 
	
		
			
				|  |  |         resultJsonObj.put("data",resultArray);
 | 
	
		
			
				|  |  |         resultJsonObj.put("count",esResult.getTotal());
 | 
	
		
			
				|  |  |         long count = System.currentTimeMillis() - time;
 | 
	
		
			
				|  |  |         logger.info("load data from hbase end:" + org.apache.http.client.utils.DateUtils.formatDate(new Date(), DateUtil.yyyy_MM_dd_HH_mm_ss) + ",count: " + count);
 | 
	
		
			
				|  |  |         return resultJsonObj.toJSONString();
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 体征数据查询,数据转为视图展示VO类
 | 
	
		
			
				|  |  |      * @param jsonData
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public List<DataBodySignsVO> getDataToBean(String jsonData){
 | 
	
		
			
				|  |  |         List<DataBodySignsVO> result = new ArrayList<>();
 | 
	
		
			
				|  |  |         logger.info("load data from elasticsearch start:" + org.apache.http.client.utils.DateUtils.formatDate(new Date(), DateUtil.yyyy_MM_dd_HH_mm_ss));
 | 
	
		
			
				|  |  |         SearchSourceBuilder query = getQueryBuilder("data",jsonData);
 | 
	
		
			
				|  |  |         SearchResult esResult = elastricSearchHelper.search(ConstantUtils.esIndex,ConstantUtils.esType,query.toString());
 | 
	
		
			
				|  |  |         if(null!= esResult && esResult.getTotal() == 0){
 | 
	
		
			
				|  |  |             return result;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         for(String str :esResult.getSourceAsStringList()){
 | 
	
		
			
				|  |  |             DataBodySignsVO dataBodySignsVO = JSONObject.parseObject(str,DataBodySignsVO.class);
 | 
	
		
			
				|  |  |             result.add(dataBodySignsVO);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         return result;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 查询微信运动数据
 | 
	
		
			
				|  |  |      * @param json
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public List<WeRunDataVO> getWeRunDataList(String json){
 | 
	
		
			
				|  |  |         List<WeRunDataVO> result = new ArrayList<>();
 | 
	
		
			
				|  |  |         SearchSourceBuilder query = getQueryBuilder("stepInfoList",json);
 | 
	
		
			
				|  |  |         SearchResult esResult = elastricSearchHelper.search(ConstantUtils.weRunDataIndex,ConstantUtils.weRunDataType,query.toString());
 | 
	
		
			
				|  |  |         if(null != esResult && esResult.getTotal() == 0){
 | 
	
		
			
				|  |  |             return result;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         for(String str:esResult.getSourceAsStringList()){
 | 
	
		
			
				|  |  |             WeRunDataVO weRunDataVO = JSONObject.parseObject(str,WeRunDataVO.class);
 | 
	
		
			
				|  |  |             result.add(weRunDataVO);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return result;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public static void main(String args[]) {
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         init();
 | 
	
		
			
				|  |  |         String str = "{\n" +
 | 
	
		
			
				|  |  |                 "\t\"filter\":[{\n" +
 | 
	
		
			
				|  |  |                 "\t\t\"andOr\":\"and\",\n" +
 | 
	
		
			
				|  |  |                 "\t\t\"condition\":\"=\",\n" +
 | 
	
		
			
				|  |  |                 "\t\t\"field\":\"usercode\",\n" +
 | 
	
		
			
				|  |  |                 "\t\t\"value\":\"thisisjustatest\"\n" +
 | 
	
		
			
				|  |  |                 "\t},\n" +
 | 
	
		
			
				|  |  |                 "\t{\n" +
 | 
	
		
			
				|  |  |                 "\t\t\"andOr\":\"and\",\n" +
 | 
	
		
			
				|  |  |                 "\t\t\"condition\":\"=\",\n" +
 | 
	
		
			
				|  |  |                 "\t\t\"field\":\"step\",\n" +
 | 
	
		
			
				|  |  |                 "\t\t\"value\":100\n" +
 | 
	
		
			
				|  |  |                 "\t}\n" +
 | 
	
		
			
				|  |  |                 "\t]\n" +
 | 
	
		
			
				|  |  |                 "}\n";
 | 
	
		
			
				|  |  |         getQueryBuilder("stepInfoList",str);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | }
 |