package com.topwalk.analysis.es.operation.impl; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import org.apache.log4j.Logger; import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse; import org.elasticsearch.action.bulk.BulkProcessor; import org.elasticsearch.action.bulk.BulkProcessor.Listener; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.count.CountRequestBuilder; import org.elasticsearch.action.count.CountResponse; import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.deletebyquery.DeleteByQueryRequestBuilder; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.client.Client; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.cluster.metadata.MappingMetaData; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.indices.IndexMissingException; import org.elasticsearch.script.ScriptService; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.MultiBucketsAggregation; import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogram; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.aggregations.metrics.stats.Stats; import org.elasticsearch.search.aggregations.metrics.sum.Sum; import org.elasticsearch.search.sort.SortOrder; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.topwalk.analysis.es.configuration.EsAggregation; import com.topwalk.analysis.es.configuration.EsAggregationParams; import com.topwalk.analysis.es.configuration.EsQueryParam; import com.topwalk.analysis.es.configuration.LogicOperator; import com.topwalk.analysis.es.configuration.Operator; import com.topwalk.analysis.es.configuration.Pager; import com.topwalk.analysis.es.factory.EsClient; import com.topwalk.analysis.es.operation.intf.EsService; public class EsServiceImpl implements EsService{ private Logger logger = Logger.getLogger(EsServiceImpl.class); @Override public boolean indexDataById(Client client, String index, String type, String id, String data) { // TODO Auto-generated method stub IndexResponse response = null; try { response = client.prepareIndex(index, type, id).setSource(data).execute().actionGet(); } catch (Exception e) { e.printStackTrace(); return false; } return response.isCreated(); } @Override public boolean bulkindexData(Client client, String index, String type, String data) { // TODO Auto-generated method stub BulkRequestBuilder bulkRequest = client.prepareBulk(); JSONArray arry = JSON.parseArray(data); for(int i = 0; i < arry.size(); i++) { JSONObject jobj = JSON.parseObject(arry.getString(i)); if(jobj.containsKey("_id")) { String _id = jobj.getString("_id"); jobj.remove("_id"); bulkRequest.add(client.prepareIndex(index, type, _id).setSource(arry.getString(i)) ); } else { bulkRequest.add(client.prepareIndex(index, type).setSource(arry.getString(i)) ); } } BulkResponse bulkResponse = bulkRequest.execute().actionGet(); if(bulkResponse.hasFailures()) { logger.error("bulkinsert fail message...." + bulkResponse.buildFailureMessage()); return false; } else { return true; } } @Override public boolean bulkupdateData(Client client, String index, String type, String data, List<EsQueryParam> params) { // TODO Auto-generated method stub List<String> types = new ArrayList<String>(); types.add(type); EsServiceImpl esimpl = new EsServiceImpl(); Pager page = new Pager(); page.setFrom(0); int count = esimpl.getCountByFields(client, index, types, params); page.setNum(count); List<String> ids = esimpl.getIdByFields(client, index, type, params, page); if(ids.size() == 0 || count == 0) { return false; } Map<String, Object> fieldValue = (Map<String, Object>) JSON.parse(data); for (String id : ids ) { esimpl.updateIndexById(client, index, type, id, fieldValue); } return true; } @Override public boolean indexData(Client client, String index, String type, String data) { // TODO Auto-generated method stub IndexResponse response = null; try { response = client.prepareIndex(index, type).setSource(data).execute().actionGet(); } catch (Exception e) { e.printStackTrace(); return false; } return response.isCreated(); } @Override public String getIndexById(Client client, String index, String type, String id) { // TODO Auto-generated method stub GetResponse response = null ; String result = null; try { response = client.prepareGet(index, type, id).execute().actionGet(); result = response.getSourceAsString(); } catch (Exception e ) { e.printStackTrace(); } return result; } @Override public boolean isIndexExists(Client client, String index, String type, String id) { // TODO Auto-generated method stub GetResponse response = null ; boolean result = false; try { response = client.prepareGet(index, type, id).execute().actionGet(); result = response.isExists(); } catch (Exception e ) { e.printStackTrace(); return false; } return result; } @Override public boolean delIndexById(Client client, String index, String type, String id) { // TODO Auto-generated method stub DeleteResponse response = null ; boolean result = false; try { response = client.prepareDelete(index, type, id).execute().actionGet(); result = response.isFound(); } catch (Exception e ) { e.printStackTrace(); return result; } return result; } @Override public boolean delIndexByFields(Client client, String index, String type, List<EsQueryParam> params) { // TODO Auto-generated method stub BoolQueryBuilder db = QueryBuilders.boolQuery(); try { DeleteByQueryRequestBuilder dbq = client.prepareDeleteByQuery(index).setTypes(type); db = getQueryBuilder(params); dbq.setQuery(db); dbq.execute().actionGet(); } catch (Exception e ) { e.printStackTrace(); return true; } return true; } @Override public boolean updateIndexById(Client client, String index, String type, String id, Map<String, Object> fieldValue) { UpdateResponse response = null; UpdateRequest updateRequest = new UpdateRequest(); updateRequest.index(index); if(type != null) { updateRequest.type(type); } updateRequest.id(id); updateRequest.doc(fieldValue); updateRequest.retryOnConflict(5); try { response = client.update(updateRequest).get(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } return true; } @Override public boolean addFieldToDoc(Client client, String index, String type, String id, Map<String, Object> fieldValue) { // TODO Auto-generated method stub Iterator<String> iter = fieldValue.keySet().iterator(); boolean isExist = false; while (iter.hasNext()) { String key = iter.next(); isExist = isFieldExist(client, index, type, id, key); if(isExist) { try { throw new Exception("the key [" + key + "] is exist!"); } catch (Exception e) { e.printStackTrace(); return false; } } } UpdateResponse response = null; UpdateRequest updateRequest = new UpdateRequest(); updateRequest.index(index).type(type).id(id); updateRequest.doc(fieldValue); try { response = client.update(updateRequest).get(); } catch (InterruptedException e) { e.printStackTrace(); return false; } catch (ExecutionException e) { e.printStackTrace(); return false; } return true; } @Override public boolean removeieldFromDoc(Client client, String index, String type, String id, String field) { boolean isExist = false; isExist = isFieldExist( client, index, type, id, field); if(! isExist) { try { throw new Exception("the key [" + field + "] is not exist!"); } catch (Exception e) { e.printStackTrace(); return false; } } try { client.prepareUpdate(index, type, id).setScript("ctx._source.remove(\"" + field+ "\")", ScriptService.ScriptType.INLINE).execute().actionGet(); } catch (Exception e) { e.printStackTrace(); return false; } return true; } public List<String> getIdByFields(Client client, String index, String type, List<EsQueryParam> params, Pager pager) { BoolQueryBuilder db = QueryBuilders.boolQuery(); List<String> list= new ArrayList<String>(); SearchRequestBuilder searchRequest = null; db = getQueryBuilder(params); if (params != null && params.size() > 0 ) { searchRequest = client.prepareSearch(index).setQuery(db).setTypes(type); } else { searchRequest = client.prepareSearch(index).setQuery(QueryBuilders.matchAllQuery()).setTypes(type); } if(pager != null && pager.getFrom() >= 0 && pager.getNum() > 0 ) { searchRequest.setFrom(pager.getFrom()).setSize(pager.getNum()); } else if(pager != null && pager.getSortField() != null && pager.getSortValue().equals( "ASC")) { searchRequest.addSort(pager.getSortField(), SortOrder.ASC); } else if(pager != null && pager.getSortField() != null && pager.getSortValue().equals("desc")) { searchRequest.addSort(pager.getSortField(), SortOrder.DESC); } SearchResponse response = searchRequest.execute().actionGet(); for(SearchHit hit : response.getHits()) { list.add(hit.getId()); } return list; } @Override public List<String> getIndexByFields(Client client, String index, List<String> types, List<EsQueryParam> params, Pager pager) { BoolQueryBuilder db = QueryBuilders.boolQuery(); List<String> list= new ArrayList<String>(); try { SearchRequestBuilder searchRequest = null; if (params != null && params.size() > 0 ) { db = getQueryBuilder(params); searchRequest = client.prepareSearch(index).setQuery(db); } else { searchRequest = client.prepareSearch(index).setQuery(QueryBuilders.matchAllQuery()); } if(pager != null && pager.getFrom() >= 0 && pager.getNum() > 0 ) { searchRequest.setFrom(pager.getFrom()).setSize(pager.getNum()); } else if(pager != null && pager.getSortField() != null && pager.getSortValue().equals("asc")) { searchRequest.addSort(pager.getSortField(), SortOrder.ASC); } else if(pager != null && pager.getSortField() != null && pager.getSortValue().equals("desc")) { searchRequest.addSort(pager.getSortField(), SortOrder.DESC); } if(types != null && types.size() > 0) { String[] a = new String[types.size()]; searchRequest.setTypes(types.toArray(a)); } SearchResponse response = searchRequest.execute().actionGet(); if(response.getHits().totalHits() > 0) { for(SearchHit hit : response.getHits()) { list.add(JSON.toJSONString(hit.getSource())); } } } catch (Exception e) { e.printStackTrace(); } return list; } @Override public List<String> scrollSearch(Client client, String index, String type, List<EsQueryParam> params, Pager pager) { BoolQueryBuilder db = QueryBuilders.boolQuery(); List<String> list= new ArrayList<String>(); try { SearchRequestBuilder searchRequest = null; if (params != null && params.size() > 0 ) { db = getQueryBuilder(params); searchRequest = client.prepareSearch(index).setSearchType(SearchType.SCAN).setScroll(new TimeValue(60000)).setQuery(db); } else { searchRequest = client.prepareSearch(index).setSearchType(SearchType.SCAN).setScroll(new TimeValue(60000)).setQuery(QueryBuilders.matchAllQuery()); } if (type != null) { searchRequest.setTypes(type); } if(pager != null) { searchRequest.setSize(pager.getNum()); } SearchResponse scrollResp = searchRequest.execute().actionGet(); while (true) { scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet(); if(scrollResp.getHits().getHits().length == 0) { break; } for(SearchHit hit: scrollResp.getHits()) { list.add(hit.getSourceAsString()); } } } catch(Exception e) { e.printStackTrace(); } return list; } @Override public boolean reindex(Client client, String index, String type,String newindex, String newtype, List<EsQueryParam> params) { BoolQueryBuilder db = QueryBuilders.boolQuery(); try { SearchRequestBuilder searchRequest = null; if (params != null && params.size() > 0 ) { db = getQueryBuilder(params); searchRequest = client.prepareSearch(index).setSearchType(SearchType.SCAN).setScroll(new TimeValue(60000)).setQuery(db); } else { searchRequest = client.prepareSearch(index).setSearchType(SearchType.SCAN).setScroll(new TimeValue(60000)).setQuery(QueryBuilders.matchAllQuery()); } if (type != null) { searchRequest.setTypes(type); } SearchResponse scrollResp = searchRequest.execute().actionGet(); BulkProcessor bulkProcessor = BulkProcessor.builder(client, createBulkProcessorListener()) .setBulkActions(10000) .setFlushInterval(TimeValue.timeValueSeconds(5)).build(); while (true) { scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet(); if(scrollResp.getHits().getHits().length == 0) { bulkProcessor.close(); break; } for(SearchHit hit: scrollResp.getHits()) { IndexRequest request = new IndexRequest(newindex, newtype, hit.id()); request.source(hit.getSourceAsString()); bulkProcessor.add(request); } bulkProcessor.flush(); } } catch(Exception e) { e.printStackTrace(); return false; } return true; } public Map<String, Object> getMappings(Client client, String index, String type) { Map<String, Object> result = null; IndexMetaData imd = null; try { ClusterState cs = client.admin() .cluster() .prepareState() .setIndices(index) .execute() .actionGet() .getState(); imd = cs.getMetaData().index(index); MappingMetaData mdd = imd.mapping(type); result = mdd.getSourceAsMap(); } catch (IndexMissingException | IOException e) { } return result; } public Listener createBulkProcessorListener() { return new BulkProcessor.Listener() { @Override public void beforeBulk(long executionId, BulkRequest request) { // TODO Auto-generated method stub } @Override public void afterBulk(long executionId, BulkRequest request, Throwable failure) { // TODO Auto-generated method stub } @Override public void afterBulk(long executionId, BulkRequest request, BulkResponse response) { // TODO Auto-generated method stub } }; } @Override public int getCountByFields(Client client, String index, List<String> types, List<EsQueryParam> params) { CountResponse response = null; CountRequestBuilder countBuilder = null; BoolQueryBuilder db = null; try { db = getQueryBuilder(params); countBuilder = client.prepareCount(index); if(types != null && types.size() > 0) { String[] a = new String[types.size()]; countBuilder.setTypes(types.toArray(a)); } if (params != null && params.size() > 0) { response = countBuilder.setQuery(db).execute().actionGet(); } else { response = countBuilder.setQuery(QueryBuilders.matchAllQuery()).execute().actionGet(); } } catch (Exception e) { e.printStackTrace(); } return (int) response.getCount(); } //check field isexist public boolean isFieldExist(Client client, String index, String type, String id, String key) { GetResponse response = null ; boolean result = false; try { response = client.prepareGet(index, type, id).execute().actionGet(); result = JSON.parseObject(response.getSourceAsString()).containsKey(key); } catch (Exception e ) { e.printStackTrace(); } return result; } @Override public int getTermsCountByAgg(Client client, String index, List<String> types, List<EsQueryParam> params, List<EsAggregationParams> aggList, Pager page) { BoolQueryBuilder db = null; if(params != null) { db = getQueryBuilder(params); } List<Map<String, String>> result = new ArrayList<Map<String, String>>(); AbstractAggregationBuilder parentBuilder = null; for (int i = aggList.size()-1; i >= 0; i--) { EsAggregationParams aggParams = aggList.get(i); if(i == aggList.size()-1) { if (aggParams.getEsAggregation() == EsAggregation.TERM) { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).size(page.getNum()); } } else { if (aggParams.getEsAggregation() == EsAggregation.TERM) { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).size(page.getNum()).subAggregation(parentBuilder); } } } SearchRequestBuilder requestBuilder = client.prepareSearch(index); if(types != null && types.size() > 0) { String[] a = new String[types.size()]; requestBuilder.setTypes(types.toArray(a)); } requestBuilder.addAggregation(parentBuilder); if(db != null) { requestBuilder.setQuery(db); } SearchResponse sr = requestBuilder.execute().actionGet(); Terms t = sr.getAggregations().get(aggList.get(0).getAggName()); Iterator< ? extends MultiBucketsAggregation.Bucket > topBucket = null; topBucket = t.getBuckets().iterator(); result = getMap(topBucket, aggList, 0, result, null); return result.size(); } @Override public List<Map<String, String>> AggregationByFields(Client client, String index, List<String> types, List<EsQueryParam> params, List<EsAggregationParams> aggList) { BoolQueryBuilder db = null; if(params != null && params.size() > 0) { db = getQueryBuilder(params); } List<Map<String, String>> result = new ArrayList<Map<String, String>>(); AbstractAggregationBuilder parentBuilder = null; for (int i = aggList.size()-1; i >= 0; i--) { EsAggregationParams aggParams = aggList.get(i); if(i == aggList.size()-1) { if (aggParams.getEsAggregation() == EsAggregation.STATS) { parentBuilder = AggregationBuilders.stats( aggParams.getAggName()) .field(aggParams.getField()); } else if (aggParams.getEsAggregation() == EsAggregation.DATE_HISTOGRAM) { DateHistogram.Order order = null; if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("asc")) { order = DateHistogram.Order.KEY_ASC; } else if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("desc") ) { order = DateHistogram.Order.KEY_DESC; }else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("asc") ) { order = DateHistogram.Order.COUNT_ASC; } else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("desc") ){ order = DateHistogram.Order.COUNT_DESC; } parentBuilder = AggregationBuilders.dateHistogram(aggParams.getAggName()).field(aggParams.getField()).interval(aggParams.getDateInterval()).order(order); } else if (aggParams.getEsAggregation() == EsAggregation.TERM) { Terms.Order order = null; if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("asc")) { order = Terms.Order.term(true); } else if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("desc") ) { order = Terms.Order.term(false); }else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("asc") ) { order = Terms.Order.count(true); } else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("desc") ){ order = Terms.Order.count(false); } if( aggParams.isKeyOrder() == null && aggParams.isValOrder() == null) { if (aggParams.getAggSize() == 0) { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).size(aggParams.getAggSize()); } else { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).size(aggParams.getAggSize()); } } else { if (aggParams.getAggSize() == 0) { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).size(aggParams.getAggSize()).order(order); } else { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).size(aggParams.getAggSize()).order(order); } } } else if (aggParams.getEsAggregation() == EsAggregation.TERM_SCRIPTS) { Terms.Order order = null; if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("asc")) { order = Terms.Order.term(true); } else if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("desc") ) { order = Terms.Order.term(false); }else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("asc") ) { order = Terms.Order.count(true); } else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("desc") ){ order = Terms.Order.count(false); } if( aggParams.isKeyOrder() == null || aggParams.isValOrder() == null) { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).script(aggParams.getField()); } else { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).script(aggParams.getField()).order(order); } } else if (aggParams.getEsAggregation() == EsAggregation.HISTOGRAM) { parentBuilder = AggregationBuilders.histogram(aggParams.getAggName()).field(aggParams.getField()).interval(aggParams.getHisaggrateInterval()); } else if (aggParams.getEsAggregation() == EsAggregation.SUM) { parentBuilder = AggregationBuilders.sum(aggParams.getAggName()).field(aggParams.getField()); } } else { if (aggParams.getEsAggregation() == EsAggregation.TERM) { Terms.Order order = null; if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("asc")) { order = Terms.Order.term(true); } else if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("desc") ) { order = Terms.Order.term(false); }else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("asc") ) { order = Terms.Order.count(true); } else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("desc") ){ order = Terms.Order.count(false); } if( aggParams.isKeyOrder() == null && aggParams.isValOrder() == null) { if (aggParams.getAggSize() == 0 ) { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).size(aggParams.getAggSize()).subAggregation(parentBuilder); } else { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).size(aggParams.getAggSize()).subAggregation(parentBuilder); } } else { if (aggParams.getAggSize() == 0 ) { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).order(order).size(aggParams.getAggSize()).subAggregation(parentBuilder); } else { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).order(order).size(aggParams.getAggSize()).subAggregation(parentBuilder); } } } else if (aggParams.getEsAggregation() == EsAggregation.TERM_SCRIPTS) { Terms.Order order = null; if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("asc")) { order = Terms.Order.term(true); } else if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("desc") ) { order = Terms.Order.term(false); }else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("asc") ) { order = Terms.Order.count(true); } else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("desc") ){ order = Terms.Order.count(false); } if( aggParams.isKeyOrder() == null || aggParams.isValOrder() == null) { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).script(aggParams.getField()).subAggregation(parentBuilder); } else { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).script(aggParams.getField()).order(order).subAggregation(parentBuilder); } } else if (aggParams.getEsAggregation() == EsAggregation.DATE_HISTOGRAM) { DateHistogram.Order order = null; if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("asc")) { order = DateHistogram.Order.KEY_ASC; } else if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("desc") ) { order = DateHistogram.Order.KEY_DESC; }else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("asc") ) { order = DateHistogram.Order.COUNT_ASC; } else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("desc") ){ order = DateHistogram.Order.COUNT_DESC; } parentBuilder = AggregationBuilders.dateHistogram(aggParams.getAggName()).field(aggParams.getField()).interval(aggParams.getDateInterval()).subAggregation(parentBuilder).order(order); } else if (aggParams.getEsAggregation() == EsAggregation.HISTOGRAM) { parentBuilder = AggregationBuilders.histogram(aggParams.getAggName()).field(aggParams.getField()).interval(aggParams.getHisaggrateInterval()).subAggregation(parentBuilder); } } } SearchRequestBuilder requestBuilder = client.prepareSearch(index); if(types != null && types.size() > 0) { String[] a = new String[types.size()]; requestBuilder.setTypes(types.toArray(a)); } requestBuilder.addAggregation(parentBuilder); if(db != null) { requestBuilder.setQuery(db); } logger.debug(requestBuilder.toString()); SearchResponse sr = requestBuilder.execute().actionGet(); Iterator< ? extends MultiBucketsAggregation.Bucket > topBucket = null; if(aggList.get(0).getEsAggregation() == EsAggregation.DATE_HISTOGRAM) { DateHistogram agg = sr.getAggregations().get(aggList.get(0).getAggName()); topBucket = agg.getBuckets().iterator(); } else if (aggList.get(0).getEsAggregation() == EsAggregation.TERM ||aggList.get(0).getEsAggregation() == EsAggregation.TERM_SCRIPTS ) { Terms t = sr.getAggregations().get(aggList.get(0).getAggName()); topBucket = t.getBuckets().iterator(); } else if (aggList.get(0).getEsAggregation() == EsAggregation.HISTOGRAM) { Histogram agg = sr.getAggregations().get(aggList.get(0).getAggName()); topBucket = agg.getBuckets().iterator(); } else if (aggList.get(0).getEsAggregation() == EsAggregation.SUM) { Sum agg = sr.getAggregations().get(aggList.get(0).getAggName()); Map<String, String> sumresult = new HashMap<String, String>(); sumresult.put(agg.getName(), String.valueOf(agg.getValue())); result.add(sumresult); return result; } else if(aggList.get(0).getEsAggregation() == EsAggregation.STATS) { Stats stats = sr.getAggregations().get(aggList.get(0).getAggName()); Map<String, String> statsresult = new HashMap<String, String>(); statsresult.put("count", String.valueOf(stats.getCount())); statsresult.put("avg", String.valueOf(stats.getAvg())); statsresult.put("max", String.valueOf(stats.getMax())); statsresult.put("min", String.valueOf(stats.getMin())); statsresult.put("sum", String.valueOf(stats.getSum())); result.add(statsresult); return result; } Map<String, String> map = new HashMap<String, String>(); result = getMap(topBucket, aggList, 0, result, map); return result; } @Override public SearchResponse getResponseByAggregationField(Client client, String index, List<String> types, List<EsQueryParam> params, List<EsAggregationParams> aggList) { BoolQueryBuilder db = null; if(params != null && params.size() > 0) { db = getQueryBuilder(params); } List<Map<String, String>> result = new ArrayList<Map<String, String>>(); AbstractAggregationBuilder parentBuilder = null; for (int i = aggList.size()-1; i >= 0; i--) { EsAggregationParams aggParams = aggList.get(i); if(i == aggList.size()-1) { if (aggParams.getEsAggregation() == EsAggregation.STATS) { parentBuilder = AggregationBuilders.stats( aggParams.getAggName()) .field(aggParams.getField()); } else if (aggParams.getEsAggregation() == EsAggregation.DATE_HISTOGRAM) { DateHistogram.Order order = null; if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("asc")) { order = DateHistogram.Order.KEY_ASC; } else if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("desc") ) { order = DateHistogram.Order.KEY_DESC; }else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("asc") ) { order = DateHistogram.Order.COUNT_ASC; } else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("desc") ){ order = DateHistogram.Order.COUNT_DESC; } parentBuilder = AggregationBuilders.dateHistogram(aggParams.getAggName()).field(aggParams.getField()).interval(aggParams.getDateInterval()).order(order); } else if (aggParams.getEsAggregation() == EsAggregation.TERM) { Terms.Order order = null; if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("asc")) { order = Terms.Order.term(true); } else if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("desc") ) { order = Terms.Order.term(false); }else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("asc") ) { order = Terms.Order.count(true); } else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("desc") ){ order = Terms.Order.count(false); } if( aggParams.isKeyOrder() == null && aggParams.isValOrder() == null) { if (aggParams.getAggSize() == 0) { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).size(aggParams.getAggSize()); } else { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).size(aggParams.getAggSize()); } } else { if (aggParams.getAggSize() == 0) { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).size(aggParams.getAggSize()).order(order); } else { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).size(aggParams.getAggSize()).order(order); } } } else if (aggParams.getEsAggregation() == EsAggregation.TERM_SCRIPTS) { Terms.Order order = null; if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("asc")) { order = Terms.Order.term(true); } else if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("desc") ) { order = Terms.Order.term(false); }else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("asc") ) { order = Terms.Order.count(true); } else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("desc") ){ order = Terms.Order.count(false); } if( aggParams.isKeyOrder() == null || aggParams.isValOrder() == null) { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).script(aggParams.getField()); } else { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).script(aggParams.getField()).order(order); } } else if (aggParams.getEsAggregation() == EsAggregation.HISTOGRAM) { parentBuilder = AggregationBuilders.histogram(aggParams.getAggName()).field(aggParams.getField()).interval(aggParams.getHisaggrateInterval()); } else if (aggParams.getEsAggregation() == EsAggregation.SUM) { parentBuilder = AggregationBuilders.sum(aggParams.getAggName()).field(aggParams.getField()); } else if (aggParams.getEsAggregation() == EsAggregation.SUM_SCRIPTS) { parentBuilder = AggregationBuilders.sum(aggParams.getAggName()).script(aggParams.getField()); } } else { if (aggParams.getEsAggregation() == EsAggregation.TERM) { Terms.Order order = null; if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("asc")) { order = Terms.Order.term(true); } else if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("desc") ) { order = Terms.Order.term(false); }else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("asc") ) { order = Terms.Order.count(true); } else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("desc") ){ order = Terms.Order.count(false); } if( aggParams.isKeyOrder() == null && aggParams.isValOrder() == null) { if (aggParams.getAggSize() == 0 ) { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).size(aggParams.getAggSize()).subAggregation(parentBuilder); } else { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).size(aggParams.getAggSize()).subAggregation(parentBuilder); } } else { if (aggParams.getAggSize() == 0 ) { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).order(order).size(aggParams.getAggSize()).subAggregation(parentBuilder); } else { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).field(aggParams.getField()).order(order).size(aggParams.getAggSize()).subAggregation(parentBuilder); } } } else if (aggParams.getEsAggregation() == EsAggregation.TERM_SCRIPTS) { Terms.Order order = null; if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("asc")) { order = Terms.Order.term(true); } else if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("desc") ) { order = Terms.Order.term(false); }else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("asc") ) { order = Terms.Order.count(true); } else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("desc") ){ order = Terms.Order.count(false); } if( aggParams.isKeyOrder() == null || aggParams.isValOrder() == null) { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).script(aggParams.getField()).subAggregation(parentBuilder); } else { parentBuilder = AggregationBuilders.terms(aggParams.getAggName()).script(aggParams.getField()).order(order).subAggregation(parentBuilder); } } else if (aggParams.getEsAggregation() == EsAggregation.DATE_HISTOGRAM) { DateHistogram.Order order = null; if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("asc")) { order = DateHistogram.Order.KEY_ASC; } else if( aggParams.isKeyOrder() !=null && aggParams.isKeyOrder().equals("desc") ) { order = DateHistogram.Order.KEY_DESC; }else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("asc") ) { order = DateHistogram.Order.COUNT_ASC; } else if( aggParams.isValOrder() !=null && aggParams.isValOrder().equals("desc") ){ order = DateHistogram.Order.COUNT_DESC; } parentBuilder = AggregationBuilders.dateHistogram(aggParams.getAggName()).field(aggParams.getField()).interval(aggParams.getDateInterval()).subAggregation(parentBuilder).order(order); } else if (aggParams.getEsAggregation() == EsAggregation.HISTOGRAM) { parentBuilder = AggregationBuilders.histogram(aggParams.getAggName()).field(aggParams.getField()).interval(aggParams.getHisaggrateInterval()).subAggregation(parentBuilder); } } } SearchRequestBuilder requestBuilder = client.prepareSearch(index); if(types != null && types.size() > 0) { String[] a = new String[types.size()]; requestBuilder.setTypes(types.toArray(a)); } requestBuilder.addAggregation(parentBuilder); if(db != null) { requestBuilder.setQuery(db); } System.out.println(requestBuilder.toString()); SearchResponse sr = requestBuilder.execute().actionGet(); return sr; } public List<Map<String, String>> getMap(Iterator< ? extends MultiBucketsAggregation.Bucket > topBucket , List<EsAggregationParams> aggList, int level, List<Map<String, String>> result, Map<String, String> map) { if (aggList.size() ==1&& level == 0) { while(topBucket.hasNext()) { map = new HashMap<String, String>(); MultiBucketsAggregation.Bucket b3= topBucket.next(); if (aggList.get(0).getEsAggregation() == EsAggregation.TERM_SCRIPTS) { map.put( b3.getKey(), String.valueOf(b3.getDocCount()) ); } else { map.put(aggList.get(0).getField(), b3.getKey()); map.put("doc_count", String.valueOf(b3.getDocCount())); } result.add(map); } return result; } else { level ++; } if(level < aggList.size() && aggList.size() != 1) { while(topBucket.hasNext()) { Map<String, String> map2 = new HashMap<String, String>(); MultiBucketsAggregation.Bucket b2= topBucket.next(); map2.put(aggList.get(level-1).getField(), b2.getKey()); map2.put("doc_count" , String.valueOf(b2.getDocCount()) ); if(aggList.get(level).getEsAggregation() == EsAggregation.TERM || aggList.get(level).getEsAggregation() == EsAggregation.TERM_SCRIPTS) { Terms t = b2.getAggregations().get(aggList.get(level ).getAggName()); map2.put(aggList.get(level).getField(), b2.getKey()); getMap(t.getBuckets().iterator(), aggList, level, result, map2); } else if (aggList.get(level).getEsAggregation() == EsAggregation.STATS) { Stats stats = b2.getAggregations().get(aggList.get(level ).getAggName()); map2.put("count", String.valueOf(stats.getCount())); map2.put("sum", String.valueOf(stats.getSum())); map2.put("avg", String.valueOf(stats.getAvg())); map2.put("max", String.valueOf(stats.getMax())); map2.put("min", String.valueOf(stats.getMin())); result.add(map2); } else if (aggList.get(level).getEsAggregation() == EsAggregation.SUM) { Sum agg = b2.getAggregations().get(aggList.get(level).getAggName()); map2.put(aggList.get(level ).getField(), String.valueOf(agg.getValue())); result.add(map2); } else if (aggList.get(level).getEsAggregation() == EsAggregation.DATE_HISTOGRAM) { DateHistogram datehis = b2.getAggregations().get(aggList.get(level ).getAggName()); map2.put(aggList.get(level ).getField(), b2.getKey()); getMap( datehis.getBuckets().iterator(), aggList, level, result, map2); } else if (aggList.get(level).getEsAggregation() == EsAggregation.HISTOGRAM) { Histogram his = b2.getAggregations().get(aggList.get(level ).getAggName()); map2.put(aggList.get(level ).getField(), b2.getKey()); getMap( his.getBuckets().iterator(), aggList, level, result, map2); } } return result; } else { List<Map<String, String>> list = new ArrayList<Map<String, String>>(); //List<String> list = new ArrayList<String>(); while(topBucket.hasNext()) { Map<String, String> m = new HashMap<String, String>(); MultiBucketsAggregation.Bucket b3= topBucket.next(); m.put(aggList.get(level -1 ).getField(), b3.getKey()); m.put("doc_count", String.valueOf(b3.getDocCount())); list.add(m); } map.put(aggList.get(level -1 ).getField(), JSON.toJSONString(list)); result.add(map); return result; } } public BoolQueryBuilder getQueryBuilder(List<EsQueryParam> params) { BoolQueryBuilder db = null; if (params != null) { db = QueryBuilders.boolQuery(); for (EsQueryParam param : params) { if(param.getLogicOperator() == LogicOperator.AND && param.getOperator() == Operator.EQUAL) { db = db.must(QueryBuilders.matchQuery(param.getField(), param.getValue())); } else if(param.getLogicOperator() == LogicOperator.AND && param.getOperator() == Operator.LIKE) { db = db.must(QueryBuilders.wildcardQuery(param.getField(), param.getValue())); } else if(param.getLogicOperator() == LogicOperator.OR && param.getOperator() == Operator.LIKE) { db = db.should(QueryBuilders.wildcardQuery(param.getField(), param.getValue())); } else if(param.getLogicOperator() == LogicOperator.MUST_NOT && param.getOperator() == Operator.LIKE) { db = db.mustNot(QueryBuilders.wildcardQuery(param.getField(), param.getValue())); } else if(param.getLogicOperator() == LogicOperator.MUST_NOT && param.getOperator() == Operator.EQUAL) { db = db.mustNot(QueryBuilders.matchQuery(param.getField(), param.getValue())); } else if(param.getOperator() == Operator.GT) { db = db.must(QueryBuilders.rangeQuery(param.getField()).gt(param.getValue())); } else if(param.getOperator() == Operator.GTE) { db = db.must(QueryBuilders.rangeQuery(param.getField()).gte(param.getValue())); } else if(param.getOperator() == Operator.LT) { db = db.must(QueryBuilders.rangeQuery(param.getField()).lt(param.getValue())); } else if(param.getOperator() == Operator.LTE) { db = db.must(QueryBuilders.rangeQuery(param.getField()).lte(param.getValue())); } else if (param.getLogicOperator() == LogicOperator.OR) { db = db.should(QueryBuilders.matchQuery(param.getField(), param.getValue())); } else if (param.getLogicOperator() == LogicOperator.AND ) { db = db.must(QueryBuilders.matchQuery(param.getField(), param.getValue())); } else if (param.getOperator() == Operator.EQUAL ) { db = db.must(QueryBuilders.matchQuery(param.getField(), param.getValue())); } else if (param.getOperator() == Operator.NOTEQUAL ) { db = db.mustNot(QueryBuilders.matchQuery(param.getField(), param.getValue())); } else if(param.getOperator() == Operator.TERMS) { db = db.must(QueryBuilders.termsQuery(param.getField(), param.getTermsList()).minimumMatch(1)); } else if (param.getLogicOperator() == null &¶m.getOperator() == null ) { db = db.must(QueryBuilders.matchQuery(param.getField(), param.getValue())); } } } return db; } @Override public boolean createType(Client client, String index, String type, String mapping) { // TODO Auto-generated method stub IndicesExistsRequest indexrequest = new IndicesExistsRequest(index); boolean exist = client.admin().indices().exists(indexrequest).actionGet().isExists(); if (! exist) { client.admin().indices().create(new CreateIndexRequest(index)).actionGet(); } PutMappingRequest putMappingRequest = new PutMappingRequest(index); putMappingRequest.type(type); putMappingRequest.source(mapping); PutMappingResponse putMappingResponse = client.admin().indices().putMapping(putMappingRequest).actionGet(); return putMappingResponse.isAcknowledged(); } @Override public boolean isIndexExistsByFieldVal(Client client, String index, String type, String field, String fieldVal) { // TODO Auto-generated method stub SearchRequestBuilder searchRequest = null ; boolean result = false; try { searchRequest = client.prepareSearch(index).setTypes(type).setQuery(QueryBuilders.matchQuery(field, fieldVal)); SearchResponse response = searchRequest.execute().actionGet(); result = (response.getHits().hits().length > 0) ? true : false; } catch (Exception e ) { e.printStackTrace(); return false; } return result; } @Override public SearchHits termsQuery(Client client, String index, String type,String field,List<String> terms) { SearchRequestBuilder searchRequest = null ; QueryBuilder qb = QueryBuilders.termsQuery(field, terms).minimumMatch(1); searchRequest = client.prepareSearch(index).setTypes(type).setQuery(qb).setSize(1000000000); SearchResponse response = searchRequest.execute().actionGet(); return response.getHits(); //后续优化 } }
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。
谢谢您的赞助,我会做的更好!