|  | @ -2,14 +2,38 @@ package com.yihu.jw.es.util;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import com.alibaba.druid.sql.ast.SQLExpr;
 | 
	
		
			
				|  |  | import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
 | 
	
		
			
				|  |  | import com.alibaba.druid.sql.parser.ParserException;
 | 
	
		
			
				|  |  | import com.alibaba.druid.sql.parser.SQLExprParser;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import com.yihu.jw.es.es.ElasticFactory;
 | 
	
		
			
				|  |  | import com.alibaba.druid.sql.parser.Token;
 | 
	
		
			
				|  |  | import com.alibaba.fastjson.JSON;
 | 
	
		
			
				|  |  | import com.fasterxml.jackson.databind.ObjectMapper;
 | 
	
		
			
				|  |  | import com.yihu.jw.util.date.DateUtil;
 | 
	
		
			
				|  |  | import org.apache.commons.lang3.StringUtils;
 | 
	
		
			
				|  |  | import org.elasticsearch.action.bulk.BulkRequest;
 | 
	
		
			
				|  |  | import org.elasticsearch.action.bulk.BulkResponse;
 | 
	
		
			
				|  |  | import org.elasticsearch.action.delete.DeleteRequest;
 | 
	
		
			
				|  |  | import org.elasticsearch.action.delete.DeleteRequestBuilder;
 | 
	
		
			
				|  |  | import org.elasticsearch.action.index.IndexRequest;
 | 
	
		
			
				|  |  | import org.elasticsearch.action.index.IndexResponse;
 | 
	
		
			
				|  |  | import org.elasticsearch.action.search.SearchRequest;
 | 
	
		
			
				|  |  | import org.elasticsearch.action.search.SearchResponse;
 | 
	
		
			
				|  |  | import org.elasticsearch.client.Client;
 | 
	
		
			
				|  |  | import org.elasticsearch.client.RequestOptions;
 | 
	
		
			
				|  |  | import org.elasticsearch.client.RestHighLevelClient;
 | 
	
		
			
				|  |  | import org.elasticsearch.common.unit.TimeValue;
 | 
	
		
			
				|  |  | import org.elasticsearch.common.xcontent.XContentType;
 | 
	
		
			
				|  |  | import org.elasticsearch.index.query.BoolQueryBuilder;
 | 
	
		
			
				|  |  | import org.elasticsearch.search.SearchHit;
 | 
	
		
			
				|  |  | import org.elasticsearch.search.SearchHits;
 | 
	
		
			
				|  |  | import org.elasticsearch.search.aggregations.AggregationBuilders;
 | 
	
		
			
				|  |  | import org.elasticsearch.search.aggregations.bucket.terms.*;
 | 
	
		
			
				|  |  | import org.elasticsearch.search.aggregations.metrics.InternalSum;
 | 
	
		
			
				|  |  | import org.elasticsearch.search.aggregations.metrics.InternalValueCount;
 | 
	
		
			
				|  |  | import org.elasticsearch.search.aggregations.metrics.SumAggregationBuilder;
 | 
	
		
			
				|  |  | import org.elasticsearch.search.builder.SearchSourceBuilder;
 | 
	
		
			
				|  |  | import org.elasticsearch.search.sort.SortBuilder;
 | 
	
		
			
				|  |  | import org.elasticsearch.search.sort.SortBuilders;
 | 
	
		
			
				|  |  | import org.elasticsearch.search.sort.SortOrder;
 | 
	
		
			
				|  |  | import org.nlpcn.es4sql.domain.Select;
 | 
	
		
			
				|  |  | import org.nlpcn.es4sql.jdbc.ObjectResult;
 | 
	
		
			
				|  |  | import org.nlpcn.es4sql.jdbc.ObjectResultsExtractor;
 | 
	
	
		
			
				|  | @ -26,6 +50,8 @@ import org.springframework.data.redis.core.StringRedisTemplate;
 | 
	
		
			
				|  |  | import org.springframework.jdbc.core.JdbcTemplate;
 | 
	
		
			
				|  |  | import org.springframework.stereotype.Component;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import javax.annotation.Resource;
 | 
	
		
			
				|  |  | import java.io.IOException;
 | 
	
		
			
				|  |  | import java.lang.reflect.Field;
 | 
	
		
			
				|  |  | import java.sql.Timestamp;
 | 
	
		
			
				|  |  | import java.text.ParseException;
 | 
	
	
		
			
				|  | @ -44,9 +70,11 @@ public class ElasticsearchUtil {
 | 
	
		
			
				|  |  |     private Logger logger = LoggerFactory.getLogger(ElasticsearchUtil.class);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     private final String commonParams = "xmijk_quota";
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private ElasticFactory elasticFactory;
 | 
	
		
			
				|  |  |     ObjectMapper objectMapper;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @Resource(name="restHighLevelClient")
 | 
	
		
			
				|  |  |     private RestHighLevelClient restHighLevelClient;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
		
			
				|  |  |     private StringRedisTemplate redisTemplate;
 | 
	
		
			
				|  |  |     @Autowired
 | 
	
	
		
			
				|  | @ -56,6 +84,367 @@ public class ElasticsearchUtil {
 | 
	
		
			
				|  |  |     @Value("${es.index.Statistics}")
 | 
	
		
			
				|  |  |     private String esIndex;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * @param boolQueryBuilder  查询参数 build
 | 
	
		
			
				|  |  |      * @param pageNo
 | 
	
		
			
				|  |  |      * @param pageSize
 | 
	
		
			
				|  |  |      * @param sortName 排序字段名称
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public List<Map<String, Object>> queryPageList(String index, BoolQueryBuilder boolQueryBuilder,
 | 
	
		
			
				|  |  |                                                    int pageNo, int pageSize, String sortName) throws IOException {
 | 
	
		
			
				|  |  |         SortBuilder dealSorter = SortBuilders.fieldSort(sortName).order(SortOrder.DESC);
 | 
	
		
			
				|  |  |         SearchRequest request = new SearchRequest(index);
 | 
	
		
			
				|  |  |         SearchSourceBuilder builder = new SearchSourceBuilder();
 | 
	
		
			
				|  |  |         builder.query(boolQueryBuilder).sort(dealSorter).from(pageNo - 1).size(pageSize);
 | 
	
		
			
				|  |  |         SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
 | 
	
		
			
				|  |  |         SearchHits hits = response.getHits();
 | 
	
		
			
				|  |  |         List<Map<String, Object>> matchRsult = new LinkedList<Map<String, Object>>();
 | 
	
		
			
				|  |  |         for (SearchHit hit : hits.getHits()){
 | 
	
		
			
				|  |  |             matchRsult.add(hit.getSourceAsMap());
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return matchRsult;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * @param boolQueryBuilder  查询参数 build
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public long getTotalCount(String index,BoolQueryBuilder boolQueryBuilder) throws IOException {
 | 
	
		
			
				|  |  |         SearchRequest request = new SearchRequest(index);
 | 
	
		
			
				|  |  |         SearchSourceBuilder searchBuilder = new SearchSourceBuilder();
 | 
	
		
			
				|  |  |         searchBuilder.query(boolQueryBuilder);
 | 
	
		
			
				|  |  |         request.source(searchBuilder);
 | 
	
		
			
				|  |  |         SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
 | 
	
		
			
				|  |  |         SearchHits hits = response.getHits();
 | 
	
		
			
				|  |  |         if(hits != null){
 | 
	
		
			
				|  |  |             return hits.getTotalHits().value;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return 0;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * @param boolQueryBuilder  查询参数 build
 | 
	
		
			
				|  |  |      * @param sortName 排序字段名称
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public List<Map<String, Object>> queryList(String index, String type, BoolQueryBuilder boolQueryBuilder, String sortName, int size) throws IOException {
 | 
	
		
			
				|  |  |         SearchResponse actionGet = null;
 | 
	
		
			
				|  |  |         SortBuilder dealSorter = null;
 | 
	
		
			
				|  |  |         if(sortName != null){
 | 
	
		
			
				|  |  |             dealSorter = SortBuilders.fieldSort(sortName).order(SortOrder.DESC);
 | 
	
		
			
				|  |  |         }else{
 | 
	
		
			
				|  |  |             dealSorter = SortBuilders.fieldSort("_id").order(SortOrder.DESC);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         SearchRequest searchRequest = new SearchRequest(index);
 | 
	
		
			
				|  |  |         SearchSourceBuilder builder = new SearchSourceBuilder();
 | 
	
		
			
				|  |  |         builder.sort(dealSorter);
 | 
	
		
			
				|  |  |         searchRequest.source(builder);
 | 
	
		
			
				|  |  |         actionGet = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
 | 
	
		
			
				|  |  |         SearchHits hits = actionGet.getHits();
 | 
	
		
			
				|  |  |         List<Map<String, Object>> matchRsult = new LinkedList<Map<String, Object>>();
 | 
	
		
			
				|  |  |         for (SearchHit hit : hits.getHits()){
 | 
	
		
			
				|  |  |             Map<String, Object> map = new HashMap<>() ;
 | 
	
		
			
				|  |  |             map = hit.getSourceAsMap();
 | 
	
		
			
				|  |  |             map.put("id",hit.getId());
 | 
	
		
			
				|  |  |             matchRsult.add(map);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return matchRsult;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 执行搜索(带分组求和sum)
 | 
	
		
			
				|  |  |      * @param queryBuilder 查询内容
 | 
	
		
			
				|  |  |      * @param aggsField 要分组的字段
 | 
	
		
			
				|  |  |      * @param sumField 要求和的字段  只支持一个字段
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public List<Map<String, Object>> searcherByGroup( String index, BoolQueryBuilder queryBuilder, String aggsField , String sumField) throws IOException {
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         List<Map<String, Object>> list = new ArrayList<>();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         SearchSourceBuilder builder =new  SearchSourceBuilder();
 | 
	
		
			
				|  |  |         builder.query(queryBuilder);
 | 
	
		
			
				|  |  |         SearchRequest request =new SearchRequest(index);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         //创建TermsBuilder对象,使用term查询,设置该分组的名称为 name_count,并根据aggsField字段进行分组
 | 
	
		
			
				|  |  |         TermsAggregationBuilder termsBuilder = AggregationBuilders.terms(aggsField+"_val").field(aggsField);
 | 
	
		
			
				|  |  |         SumAggregationBuilder ageAgg = AggregationBuilders.sum(sumField+"_count").field(sumField);
 | 
	
		
			
				|  |  |         builder.aggregation(termsBuilder.subAggregation(ageAgg));
 | 
	
		
			
				|  |  |         request.source(builder);
 | 
	
		
			
				|  |  |         Map<String, Object> dataMap = new HashMap<String, Object>();
 | 
	
		
			
				|  |  |         //执行搜索
 | 
	
		
			
				|  |  |         SearchResponse searchResponse = restHighLevelClient.search(request,RequestOptions.DEFAULT);
 | 
	
		
			
				|  |  |         //解析返回数据,获取分组名称为aggs-class的数据
 | 
	
		
			
				|  |  |         Terms terms = searchResponse.getAggregations().get(aggsField+"_val");
 | 
	
		
			
				|  |  |         Collection<Terms.Bucket> buckets = (Collection<Terms.Bucket>) terms.getBuckets();
 | 
	
		
			
				|  |  |         for (Terms.Bucket bucket : buckets) {
 | 
	
		
			
				|  |  |             String key = bucket.getKey().toString();
 | 
	
		
			
				|  |  |             if (bucket.getAggregations().asList().get(0) instanceof InternalSum) {//(sum(xx))
 | 
	
		
			
				|  |  |                 InternalSum count = (InternalSum) bucket.getAggregations().asList().get(0);
 | 
	
		
			
				|  |  |                 dataMap.put(key, count.value());
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         list.add(dataMap);
 | 
	
		
			
				|  |  |         return list;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 根据mysql 语句进行分组求和查询
 | 
	
		
			
				|  |  |      * @param index 索引名称
 | 
	
		
			
				|  |  |      * @param aggsFields 分组字段 支持多个
 | 
	
		
			
				|  |  |      * @param filter 条件
 | 
	
		
			
				|  |  |      * @param sumField  求和字段
 | 
	
		
			
				|  |  |      * @param orderFild 排序字段
 | 
	
		
			
				|  |  |      * @param order 排序 asc,desc
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public Map<String, Integer> searcherSumByGroupBySql(String index, String aggsFields ,String filter , String sumField,String orderFild,String order) throws Exception {
 | 
	
		
			
				|  |  |         Map<String,Integer> map = new LinkedHashMap<>();
 | 
	
		
			
				|  |  |         Client client = (Client) restHighLevelClient.getLowLevelClient();
 | 
	
		
			
				|  |  | //       String mysql1 = "select org ,sum(result) from quota where quotaCode='depart_treat_count' group by org  ";id=16
 | 
	
		
			
				|  |  |         StringBuffer mysql = new StringBuffer("select ");
 | 
	
		
			
				|  |  |         mysql.append(aggsFields)
 | 
	
		
			
				|  |  |                 .append(" ,sum(").append(sumField).append(") ")
 | 
	
		
			
				|  |  |                 .append(" from ").append(index)
 | 
	
		
			
				|  |  |                 .append(" where ").append(filter)
 | 
	
		
			
				|  |  |                 .append(" group by ").append(aggsFields);
 | 
	
		
			
				|  |  |         if (org.apache.commons.lang.StringUtils.isNotEmpty(orderFild) && org.apache.commons.lang.StringUtils.isNotEmpty(order)){
 | 
	
		
			
				|  |  |             mysql.append(" order by ").append(orderFild).append(" ").append(order);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         System.out.println("查询分组 mysql= " + mysql.toString());
 | 
	
		
			
				|  |  |         SQLExprParser parser = new ElasticSqlExprParser(mysql.toString());
 | 
	
		
			
				|  |  |         SQLExpr expr = parser.expr();
 | 
	
		
			
				|  |  |         if (parser.getLexer().token() != Token.EOF) {
 | 
	
		
			
				|  |  |             throw new ParserException("illegal sql expr : " + mysql);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
 | 
	
		
			
				|  |  |         //通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等
 | 
	
		
			
				|  |  |         Select select = null;
 | 
	
		
			
				|  |  |         select = new SqlParser().parseSelect(queryExpr);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         AggregationQueryAction action = null;
 | 
	
		
			
				|  |  |         DefaultQueryAction queryAction = null;
 | 
	
		
			
				|  |  |         SqlElasticSearchRequestBuilder requestBuilder = null;
 | 
	
		
			
				|  |  |         if (select.isAgg) {
 | 
	
		
			
				|  |  |             //包含计算的的排序分组的
 | 
	
		
			
				|  |  |             action = new AggregationQueryAction(client, select);
 | 
	
		
			
				|  |  |             requestBuilder = action.explain();
 | 
	
		
			
				|  |  |         } else {
 | 
	
		
			
				|  |  |             //封装成自己的Select对象
 | 
	
		
			
				|  |  |             queryAction = new DefaultQueryAction(client, select);
 | 
	
		
			
				|  |  |             requestBuilder = queryAction.explain();
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         //之后就是对ES的操作
 | 
	
		
			
				|  |  |         SearchResponse response = (SearchResponse) requestBuilder.get();
 | 
	
		
			
				|  |  |         StringTerms stringTerms = (StringTerms) response.getAggregations().asList().get(0);
 | 
	
		
			
				|  |  |         Iterator gradeBucketIt = stringTerms.getBuckets().iterator();
 | 
	
		
			
				|  |  |         //里面存放的数据 例  350200-5-2-2    主维度  细维度1  细维度2  值
 | 
	
		
			
				|  |  |         //递归解析json
 | 
	
		
			
				|  |  |         expainJson(gradeBucketIt, map, null);
 | 
	
		
			
				|  |  |         return map;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param source 表字段组合json格式
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public boolean save(String index,String source) throws IOException {
 | 
	
		
			
				|  |  |         IndexRequest request = new IndexRequest(index);
 | 
	
		
			
				|  |  |         request.source(source);
 | 
	
		
			
				|  |  |         IndexResponse indexResponse = restHighLevelClient.index(request,RequestOptions.DEFAULT);
 | 
	
		
			
				|  |  |         boolean result =  indexResponse.isFragment();
 | 
	
		
			
				|  |  |         return result;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public <T> Boolean saveList(String index, List<T> sources) throws IOException {
 | 
	
		
			
				|  |  |         BulkRequest bulkRequest = new BulkRequest();
 | 
	
		
			
				|  |  |         bulkRequest.timeout(TimeValue.timeValueSeconds(10));
 | 
	
		
			
				|  |  |         for (int i = 0; i < sources.size(); i++) {
 | 
	
		
			
				|  |  |             bulkRequest.add(new IndexRequest(index)
 | 
	
		
			
				|  |  |                             // 不指定ID的话,新增时ID是随机的
 | 
	
		
			
				|  |  | //                    .id(items.get(i).getId().toString())
 | 
	
		
			
				|  |  |                             .source(JSON.toJSONString(sources.get(i)), XContentType.JSON)
 | 
	
		
			
				|  |  |             );
 | 
	
		
			
				|  |  |             // bulkRequest.add(UpdateRequest)   批量更新
 | 
	
		
			
				|  |  |             // bulkRequest.add(DeleteRequest)   批量删除
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
 | 
	
		
			
				|  |  |         logger.info(bulkResponse.buildFailureMessage());
 | 
	
		
			
				|  |  |         return !bulkResponse.hasFailures();
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 查询后 存在 删除
 | 
	
		
			
				|  |  |      * @param boolQueryBuilder
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public synchronized  boolean queryDelete(String index,BoolQueryBuilder boolQueryBuilder) throws IOException {
 | 
	
		
			
				|  |  |         BulkRequest builder = new BulkRequest();
 | 
	
		
			
				|  |  |         DeleteRequestBuilder deleteRequestBuilder = null ;
 | 
	
		
			
				|  |  |         SearchRequest request = new SearchRequest(index);
 | 
	
		
			
				|  |  |         SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
 | 
	
		
			
				|  |  |         sourceBuilder.size(10000);
 | 
	
		
			
				|  |  |         sourceBuilder.query(boolQueryBuilder);
 | 
	
		
			
				|  |  |         request.source(sourceBuilder);
 | 
	
		
			
				|  |  |         SearchResponse response = restHighLevelClient.search(request,RequestOptions.DEFAULT);
 | 
	
		
			
				|  |  |         SearchHits hits = response.getHits();
 | 
	
		
			
				|  |  |         for (SearchHit hit : hits.getHits()){
 | 
	
		
			
				|  |  |             DeleteRequest deleteRequest = new DeleteRequest(index);
 | 
	
		
			
				|  |  |             deleteRequest.id(hit.getId());
 | 
	
		
			
				|  |  |             builder.add(deleteRequest);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         //进行批量删除操作
 | 
	
		
			
				|  |  |         boolean optFlag = true;
 | 
	
		
			
				|  |  |         if(hits.getHits() != null && hits.getHits().length > 0){
 | 
	
		
			
				|  |  |             BulkResponse bulkResponse = restHighLevelClient.bulk(builder,RequestOptions.DEFAULT);
 | 
	
		
			
				|  |  |             if (bulkResponse.hasFailures()) {
 | 
	
		
			
				|  |  |                 optFlag = false;
 | 
	
		
			
				|  |  |             }else {
 | 
	
		
			
				|  |  |                 optFlag = true;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return  optFlag;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 递归解析json
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param gradeBucketIt
 | 
	
		
			
				|  |  |      * @param map
 | 
	
		
			
				|  |  |      * @param sb
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private void expainJson(Iterator<Terms.Bucket> gradeBucketIt,Map<String,Integer> map, StringBuffer sb) {
 | 
	
		
			
				|  |  |         while (gradeBucketIt.hasNext()) {
 | 
	
		
			
				|  |  |             Terms.Bucket b =  gradeBucketIt.next();
 | 
	
		
			
				|  |  |             if (b.getAggregations().asList().get(0) instanceof StringTerms) {
 | 
	
		
			
				|  |  |                 StringTerms stringTermsCh = (StringTerms) b.getAggregations().asList().get(0);
 | 
	
		
			
				|  |  |                 Iterator gradeBucketItCh = stringTermsCh.getBuckets().iterator();
 | 
	
		
			
				|  |  |                 while (gradeBucketItCh.hasNext()) {
 | 
	
		
			
				|  |  |                     StringBuffer sbTemp = new StringBuffer((sb == null ? "" : (sb.toString() + "-")) + b.getKey());
 | 
	
		
			
				|  |  |                     expainJson(gradeBucketItCh, map, sbTemp);
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |             }else if (b.getAggregations().asList().get(0) instanceof LongTerms) {
 | 
	
		
			
				|  |  |                 LongTerms longTermsCh = (LongTerms) b.getAggregations().asList().get(0);
 | 
	
		
			
				|  |  |                 Iterator gradeBucketItCh = longTermsCh.getBuckets().iterator();
 | 
	
		
			
				|  |  |                 while (gradeBucketItCh.hasNext()) {
 | 
	
		
			
				|  |  |                     StringBuffer sbTemp = new StringBuffer((sb == null ? "" : (sb.toString() + "-")) + b.getKey());
 | 
	
		
			
				|  |  |                     expainJson(gradeBucketItCh, map, sbTemp);
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |             }else if (b.getAggregations().asList().get(0) instanceof DoubleTerms) {
 | 
	
		
			
				|  |  |                 DoubleTerms doubleTermsCh = (DoubleTerms) b.getAggregations().asList().get(0);
 | 
	
		
			
				|  |  |                 Iterator gradeBucketItCh =doubleTermsCh.getBuckets().iterator();
 | 
	
		
			
				|  |  |                 while (gradeBucketItCh.hasNext()) {
 | 
	
		
			
				|  |  |                     StringBuffer sbTemp = new StringBuffer((sb == null ? "" : (sb.toString() + "-")) + b.getKey());
 | 
	
		
			
				|  |  |                     expainJson(gradeBucketItCh, map, sbTemp);
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |             }else if (b.getAggregations().asList().get(0) instanceof InternalValueCount) {//count(8)
 | 
	
		
			
				|  |  |                 InternalValueCount count = (InternalValueCount) b.getAggregations().asList().get(0);
 | 
	
		
			
				|  |  |                 StringBuffer sbTemp = new StringBuffer((sb == null ? "" : (sb.toString() + "-")) + b.getKey());
 | 
	
		
			
				|  |  |                 map.put(sbTemp.toString() , (int)count.getValue());
 | 
	
		
			
				|  |  |             }else if (b.getAggregations().asList().get(0) instanceof InternalSum) {//(sum(xx))
 | 
	
		
			
				|  |  |                 InternalSum count = (InternalSum) b.getAggregations().asList().get(0);
 | 
	
		
			
				|  |  |                 StringBuffer sbTemp = new StringBuffer((sb == null ? "" : (sb.toString() + "-")) + b.getKey());
 | 
	
		
			
				|  |  |                 map.put(sbTemp.toString() , (int)count.getValue());
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 执行sql查询es
 | 
	
		
			
				|  |  |      * @param sql
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public List<Map<String, Object>> excuteDataModel(String sql) {
 | 
	
		
			
				|  |  |         List<Map<String, Object>> returnModels = new ArrayList<>();
 | 
	
		
			
				|  |  |         Client client = (Client) restHighLevelClient.getLowLevelClient();
 | 
	
		
			
				|  |  |         try {
 | 
	
		
			
				|  |  |             SQLExprParser parser = new ElasticSqlExprParser(sql);
 | 
	
		
			
				|  |  |             SQLExpr expr = parser.expr();
 | 
	
		
			
				|  |  |             SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
 | 
	
		
			
				|  |  |             Select select = null;
 | 
	
		
			
				|  |  |             select = new SqlParser().parseSelect(queryExpr);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             //通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等
 | 
	
		
			
				|  |  |             AggregationQueryAction action = null;
 | 
	
		
			
				|  |  |             DefaultQueryAction queryAction = null;
 | 
	
		
			
				|  |  |             SqlElasticSearchRequestBuilder requestBuilder = null;
 | 
	
		
			
				|  |  |             if (select.isAgg) {
 | 
	
		
			
				|  |  |                 //包含计算的的排序分组的
 | 
	
		
			
				|  |  |                 action = new AggregationQueryAction(client, select);
 | 
	
		
			
				|  |  |                 requestBuilder = action.explain();
 | 
	
		
			
				|  |  |             } else {
 | 
	
		
			
				|  |  |                 //封装成自己的Select对象
 | 
	
		
			
				|  |  |                 queryAction = new DefaultQueryAction(client, select);
 | 
	
		
			
				|  |  |                 requestBuilder = queryAction.explain();
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             SearchResponse response = (SearchResponse) requestBuilder.get();
 | 
	
		
			
				|  |  |             Object queryResult = null;
 | 
	
		
			
				|  |  |             if (sql.toUpperCase().indexOf("GROUP") != -1 || sql.toUpperCase().indexOf("SUM") != -1 || sql.toUpperCase().indexOf("COUNT") != -1) {
 | 
	
		
			
				|  |  |                 queryResult = response.getAggregations();
 | 
	
		
			
				|  |  |             } else {
 | 
	
		
			
				|  |  |                 queryResult = response.getHits();
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             ObjectResult temp = new ObjectResultsExtractor(true, true, true,true,queryAction).extractResults(queryResult, true);
 | 
	
		
			
				|  |  |             List<String> heads = temp.getHeaders();
 | 
	
		
			
				|  |  |             temp.getLines().stream().forEach(one -> {
 | 
	
		
			
				|  |  |                 try {
 | 
	
		
			
				|  |  |                     Map<String, Object> oneMap = new HashMap<String, Object>();
 | 
	
		
			
				|  |  |                     for (int i = 0; i < one.size(); i++) {
 | 
	
		
			
				|  |  |                         String key = null;
 | 
	
		
			
				|  |  |                         Object value = one.get(i);
 | 
	
		
			
				|  |  |                         key = heads.get(i);
 | 
	
		
			
				|  |  |                         oneMap.put(key, value);
 | 
	
		
			
				|  |  |                     }
 | 
	
		
			
				|  |  |                     returnModels.add(oneMap);
 | 
	
		
			
				|  |  |                 } catch (Exception e) {
 | 
	
		
			
				|  |  |                     e.printStackTrace();
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |             });
 | 
	
		
			
				|  |  |         } catch (Exception e) {
 | 
	
		
			
				|  |  |             e.printStackTrace();
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return returnModels;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public long getCountBySql(String sql) {
 | 
	
		
			
				|  |  |         try {
 | 
	
		
			
				|  |  |             Client client = (Client) restHighLevelClient.getLowLevelClient();
 | 
	
		
			
				|  |  |             SQLExprParser parser = new ElasticSqlExprParser(sql);
 | 
	
		
			
				|  |  |             SQLExpr expr = parser.expr();
 | 
	
		
			
				|  |  |             SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
 | 
	
		
			
				|  |  |             Select select = null;
 | 
	
		
			
				|  |  |             select = new SqlParser().parseSelect(queryExpr);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             //通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等
 | 
	
		
			
				|  |  |             AggregationQueryAction action = null;
 | 
	
		
			
				|  |  |             DefaultQueryAction queryAction = null;
 | 
	
		
			
				|  |  |             SqlElasticSearchRequestBuilder requestBuilder = null;
 | 
	
		
			
				|  |  |             if (select.isAgg) {
 | 
	
		
			
				|  |  |                 //包含计算的的排序分组的
 | 
	
		
			
				|  |  |                 action = new AggregationQueryAction(client, select);
 | 
	
		
			
				|  |  |                 requestBuilder = action.explain();
 | 
	
		
			
				|  |  |             } else {
 | 
	
		
			
				|  |  |                 //封装成自己的Select对象
 | 
	
		
			
				|  |  |                 queryAction = new DefaultQueryAction(client, select);
 | 
	
		
			
				|  |  |                 requestBuilder = queryAction.explain();
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             SearchResponse response = (SearchResponse) requestBuilder.get();
 | 
	
		
			
				|  |  |             SearchHits hits = response.getHits();
 | 
	
		
			
				|  |  |             if(hits != null){
 | 
	
		
			
				|  |  |                 return hits.getTotalHits().value;
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             return 0;
 | 
	
		
			
				|  |  |         } catch (Exception e) {
 | 
	
		
			
				|  |  |             e.printStackTrace();
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return 0;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 直接执行essql语句
 | 
	
	
		
			
				|  | @ -64,6 +453,7 @@ public class ElasticsearchUtil {
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public ObjectResult excuteSql(String sql) throws Exception{
 | 
	
		
			
				|  |  |         Client client = (Client) restHighLevelClient.getLowLevelClient();
 | 
	
		
			
				|  |  |         SQLExprParser parser = new ElasticSqlExprParser(sql);
 | 
	
		
			
				|  |  |         SQLExpr expr = parser.expr();
 | 
	
		
			
				|  |  |         SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
 | 
	
	
		
			
				|  | @ -77,11 +467,11 @@ public class ElasticsearchUtil {
 | 
	
		
			
				|  |  |         SqlElasticSearchRequestBuilder requestBuilder = null;
 | 
	
		
			
				|  |  |         if (select.isAgg) {
 | 
	
		
			
				|  |  |             //包含计算的的排序分组的
 | 
	
		
			
				|  |  |             action = new AggregationQueryAction(elasticFactory.getTransportClient(), select);
 | 
	
		
			
				|  |  |             action = new AggregationQueryAction(client, select);
 | 
	
		
			
				|  |  |             requestBuilder = action.explain();
 | 
	
		
			
				|  |  |         } else {
 | 
	
		
			
				|  |  |             //封装成自己的Select对象
 | 
	
		
			
				|  |  |             queryAction = new DefaultQueryAction(elasticFactory.getTransportClient(), select);
 | 
	
		
			
				|  |  |             queryAction = new DefaultQueryAction(client, select);
 | 
	
		
			
				|  |  |             requestBuilder = queryAction.explain();
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         SearchResponse response = (SearchResponse) requestBuilder.get();
 | 
	
	
		
			
				|  | @ -91,13 +481,14 @@ public class ElasticsearchUtil {
 | 
	
		
			
				|  |  |         } else {
 | 
	
		
			
				|  |  |             queryResult = response.getHits();
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(queryResult, true);
 | 
	
		
			
				|  |  |         ObjectResult temp = new ObjectResultsExtractor(true, true, true,true,queryAction).extractResults(queryResult, true);
 | 
	
		
			
				|  |  |         return temp;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public List excute(String sql, Class clazz, String esType, String esIndex) {
 | 
	
		
			
				|  |  |         List saveModels = new ArrayList<>();
 | 
	
		
			
				|  |  |         Client client = (Client) restHighLevelClient.getLowLevelClient();
 | 
	
		
			
				|  |  |         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXX");
 | 
	
		
			
				|  |  |         SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 | 
	
		
			
				|  |  | 
 | 
	
	
		
			
				|  | @ -120,11 +511,11 @@ public class ElasticsearchUtil {
 | 
	
		
			
				|  |  |             SqlElasticSearchRequestBuilder requestBuilder = null;
 | 
	
		
			
				|  |  |             if (select.isAgg) {
 | 
	
		
			
				|  |  |                 //包含计算的的排序分组的
 | 
	
		
			
				|  |  |                 action = new AggregationQueryAction(elasticFactory.getTransportClient(), select);
 | 
	
		
			
				|  |  |                 action = new AggregationQueryAction(client, select);
 | 
	
		
			
				|  |  |                 requestBuilder = action.explain();
 | 
	
		
			
				|  |  |             } else {
 | 
	
		
			
				|  |  |                 //封装成自己的Select对象
 | 
	
		
			
				|  |  |                 queryAction = new DefaultQueryAction(elasticFactory.getTransportClient(), select);
 | 
	
		
			
				|  |  |                 queryAction = new DefaultQueryAction(client, select);
 | 
	
		
			
				|  |  |                 requestBuilder = queryAction.explain();
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             SearchResponse response = (SearchResponse) requestBuilder.get();
 | 
	
	
		
			
				|  | @ -134,7 +525,7 @@ public class ElasticsearchUtil {
 | 
	
		
			
				|  |  |             } else {
 | 
	
		
			
				|  |  |                 queryResult = response.getHits();
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(queryResult, true);
 | 
	
		
			
				|  |  |             ObjectResult temp = new ObjectResultsExtractor(true, true, true,true,queryAction).extractResults(queryResult, true);
 | 
	
		
			
				|  |  |             List<String> heads = temp.getHeaders();
 | 
	
		
			
				|  |  |             temp.getLines().forEach(one -> {
 | 
	
		
			
				|  |  |                 Object saveModel = null;
 | 
	
	
		
			
				|  | @ -175,12 +566,12 @@ public class ElasticsearchUtil {
 | 
	
		
			
				|  |  |                                         Date date = new Date();
 | 
	
		
			
				|  |  |                                         date = ts;
 | 
	
		
			
				|  |  |                                         value =date;
 | 
	
		
			
				|  |  |                                     
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                                     } catch (Exception e2) {
 | 
	
		
			
				|  |  |                                         value = String.valueOf(one.get(i));
 | 
	
		
			
				|  |  |                                     }
 | 
	
		
			
				|  |  |                                 }
 | 
	
		
			
				|  |  |                                 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                             }
 | 
	
		
			
				|  |  | //                            value = DateUtil.strToDate(String.valueOf(value).replace("T00:00:00+0800", " 00:00:00"), "yyyy-MM-dd HH:mm:ss");
 | 
	
		
			
				|  |  |                         }
 | 
	
	
		
			
				|  | @ -224,6 +615,7 @@ public class ElasticsearchUtil {
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public Long excuteForLong(String sql, String esType, String esIndex) {
 | 
	
		
			
				|  |  |         try {
 | 
	
		
			
				|  |  |             Client client = (Client) restHighLevelClient.getLowLevelClient();
 | 
	
		
			
				|  |  |             SQLExprParser parser = new ElasticSqlExprParser(sql);
 | 
	
		
			
				|  |  |             SQLExpr expr = parser.expr();
 | 
	
		
			
				|  |  |             SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
 | 
	
	
		
			
				|  | @ -237,15 +629,16 @@ public class ElasticsearchUtil {
 | 
	
		
			
				|  |  |             SqlElasticSearchRequestBuilder requestBuilder = null;
 | 
	
		
			
				|  |  |             if (select.isAgg) {
 | 
	
		
			
				|  |  |                 //包含计算的的排序分组的
 | 
	
		
			
				|  |  |                 action = new AggregationQueryAction(elasticFactory.getTransportClient(), select);
 | 
	
		
			
				|  |  |                 action = new AggregationQueryAction(client, select);
 | 
	
		
			
				|  |  |                 requestBuilder = action.explain();
 | 
	
		
			
				|  |  |             } else {
 | 
	
		
			
				|  |  |                 //封装成自己的Select对象
 | 
	
		
			
				|  |  |                 queryAction = new DefaultQueryAction(elasticFactory.getTransportClient(), select);
 | 
	
		
			
				|  |  |                 queryAction = new DefaultQueryAction(client, select);
 | 
	
		
			
				|  |  |                 requestBuilder = queryAction.explain();
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             SearchResponse response = (SearchResponse) requestBuilder.get();
 | 
	
		
			
				|  |  |             ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(response.getAggregations(), true);
 | 
	
		
			
				|  |  |             ObjectResult temp = new ObjectResultsExtractor(true, true, true,true,queryAction).extractResults(response.getAggregations(), true);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             Long Longvalue = ((Double) temp.getLines().get(0).get(0)).longValue();
 | 
	
		
			
				|  |  |             return Longvalue;
 | 
	
		
			
				|  |  |         } catch (Exception e) {
 | 
	
	
		
			
				|  | @ -266,6 +659,7 @@ public class ElasticsearchUtil {
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public Object excuteOneObject(String sql, Class clazz, String esType, String esIndex) {
 | 
	
		
			
				|  |  |         try {
 | 
	
		
			
				|  |  |             Client client = (Client) restHighLevelClient.getLowLevelClient();
 | 
	
		
			
				|  |  |             SQLExprParser parser = new ElasticSqlExprParser(sql);
 | 
	
		
			
				|  |  |             SQLExpr expr = parser.expr();
 | 
	
		
			
				|  |  |             SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
 | 
	
	
		
			
				|  | @ -279,15 +673,15 @@ public class ElasticsearchUtil {
 | 
	
		
			
				|  |  |             SqlElasticSearchRequestBuilder requestBuilder = null;
 | 
	
		
			
				|  |  |             if (select.isAgg) {
 | 
	
		
			
				|  |  |                 //包含计算的的排序分组的
 | 
	
		
			
				|  |  |                 action = new AggregationQueryAction(elasticFactory.getTransportClient(), select);
 | 
	
		
			
				|  |  |                 action = new AggregationQueryAction(client, select);
 | 
	
		
			
				|  |  |                 requestBuilder = action.explain();
 | 
	
		
			
				|  |  |             } else {
 | 
	
		
			
				|  |  |                 //封装成自己的Select对象
 | 
	
		
			
				|  |  |                 queryAction = new DefaultQueryAction(elasticFactory.getTransportClient(), select);
 | 
	
		
			
				|  |  |                 queryAction = new DefaultQueryAction(client, select);
 | 
	
		
			
				|  |  |                 requestBuilder = queryAction.explain();
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             SearchResponse response = (SearchResponse) requestBuilder.get();
 | 
	
		
			
				|  |  |             ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(response.getHits(), true);
 | 
	
		
			
				|  |  |             ObjectResult temp = new ObjectResultsExtractor(true, true, true,true,queryAction).extractResults(response.getHits(), true);
 | 
	
		
			
				|  |  |             List<String> heads = temp.getHeaders();
 | 
	
		
			
				|  |  |             Object saveModel = clazz.newInstance();
 | 
	
		
			
				|  |  |             try {
 | 
	
	
		
			
				|  | @ -2631,60 +3025,7 @@ public class ElasticsearchUtil {
 | 
	
		
			
				|  |  |         return resultLevel;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public List<Map<String, Object>> excuteDataModel(String sql) {
 | 
	
		
			
				|  |  |         List<Map<String, Object>> returnModels = new ArrayList<>();
 | 
	
		
			
				|  |  |         try {
 | 
	
		
			
				|  |  |             SQLExprParser parser = new ElasticSqlExprParser(sql);
 | 
	
		
			
				|  |  |             SQLExpr expr = parser.expr();
 | 
	
		
			
				|  |  |             SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
 | 
	
		
			
				|  |  | //            if (parser.getLexer().token() != Token.EOF) {
 | 
	
		
			
				|  |  | //                throw new ParserException("illegal sql expr : " + sql);
 | 
	
		
			
				|  |  | //            }
 | 
	
		
			
				|  |  |             Select select = null;
 | 
	
		
			
				|  |  |             select = new SqlParser().parseSelect(queryExpr);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |             //通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等
 | 
	
		
			
				|  |  |             AggregationQueryAction action = null;
 | 
	
		
			
				|  |  |             DefaultQueryAction queryAction = null;
 | 
	
		
			
				|  |  |             SqlElasticSearchRequestBuilder requestBuilder = null;
 | 
	
		
			
				|  |  |             if (select.isAgg) {
 | 
	
		
			
				|  |  |                 //包含计算的的排序分组的
 | 
	
		
			
				|  |  |                 action = new AggregationQueryAction(elasticFactory.getTransportClient(), select);
 | 
	
		
			
				|  |  |                 requestBuilder = action.explain();
 | 
	
		
			
				|  |  |             } else {
 | 
	
		
			
				|  |  |                 //封装成自己的Select对象
 | 
	
		
			
				|  |  |                 Client client = elasticFactory.getTransportClient();
 | 
	
		
			
				|  |  |                 queryAction = new DefaultQueryAction(client, select);
 | 
	
		
			
				|  |  |                 requestBuilder = queryAction.explain();
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             SearchResponse response = (SearchResponse) requestBuilder.get();
 | 
	
		
			
				|  |  |             Object queryResult = null;
 | 
	
		
			
				|  |  |             if (sql.toUpperCase().indexOf("GROUP") != -1 || sql.toUpperCase().indexOf("SUM") != -1) {
 | 
	
		
			
				|  |  |                 queryResult = response.getAggregations();
 | 
	
		
			
				|  |  |             } else {
 | 
	
		
			
				|  |  |                 queryResult = response.getHits();
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(queryResult, true);
 | 
	
		
			
				|  |  |             List<String> heads = temp.getHeaders();
 | 
	
		
			
				|  |  |             temp.getLines().stream().forEach(one -> {
 | 
	
		
			
				|  |  |                 try {
 | 
	
		
			
				|  |  |                     Map<String, Object> oneMap = new HashMap<String, Object>();
 | 
	
		
			
				|  |  |                     for (int i = 0; i < one.size(); i++) {
 | 
	
		
			
				|  |  |                         String key = null;
 | 
	
		
			
				|  |  |                         Object value = one.get(i);
 | 
	
		
			
				|  |  |                         key = heads.get(i);
 | 
	
		
			
				|  |  |                         oneMap.put(key, value);
 | 
	
		
			
				|  |  |                     }
 | 
	
		
			
				|  |  |                     returnModels.add(oneMap);
 | 
	
		
			
				|  |  |                 } catch (Exception e) {
 | 
	
		
			
				|  |  |                     e.printStackTrace();
 | 
	
		
			
				|  |  |                 }
 | 
	
		
			
				|  |  |             });
 | 
	
		
			
				|  |  |         } catch (Exception e) {
 | 
	
		
			
				|  |  |             e.printStackTrace();
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return returnModels;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 将slaveKey1作为筛选条件而不进行group by
 |