|
@ -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
|