附录:ES查询代码实现
使用BoolQueryBuilder进行查询实现
1.使用filter返回精确查询信息(Query用于返回相关查询) 2.should类似于or操做 3.matchQuery相当于增加$and查询 4.existsQuery相当于增加$exists操作 5.mustNot相当于增加$not操作
/** * 事件日志统计 */ public RiskEventLogCountsAndDetailsDTO eventLogCount(String partnerCode, DateTime startTime, DateTime endTime, String strategyCode,String scenarioInstanceCode,String riskLevel, String retCode){ Long time1 = System.currentTimeMillis(); RiskEventLogCountsAndDetailsDTO riskEventLogCountsAndDetailsDTO = new RiskEventLogCountsAndDetailsDTO(); SearchRequestBuilder searchRequestBuilder_prevent = null; SearchRequestBuilder searchRequestBuilder_miss = null; SearchRequestBuilder searchRequestBuilder_release = null; BoolQueryBuilder boolQueryBuilder_prevent = QueryBuilders.boolQuery(); BoolQueryBuilder boolQueryBuilder_miss = QueryBuilders.boolQuery(); BoolQueryBuilder boolQueryBuilder_release = QueryBuilders.boolQuery(); if(!StringUtils.isEmpty(partnerCode)){ boolQueryBuilder_prevent.filter(QueryBuilders.matchQuery("partner_code",partnerCode)); boolQueryBuilder_release.filter(QueryBuilders.matchQuery("partner_code",partnerCode)); boolQueryBuilder_miss.filter(QueryBuilders.matchQuery("partner_code",partnerCode)); } if(!StringUtils.isEmpty(scenarioInstanceCode)){ boolQueryBuilder_prevent.filter(QueryBuilders.matchQuery("scenario_instance_code",scenarioInstanceCode)); boolQueryBuilder_release.filter(QueryBuilders.matchQuery("scenario_instance_code",scenarioInstanceCode)); boolQueryBuilder_miss.filter(QueryBuilders.matchQuery("scenario_instance_code",scenarioInstanceCode)); } if(!StringUtils.isEmpty(strategyCode)){ boolQueryBuilder_prevent.filter(QueryBuilders.matchQuery("strategy_code",strategyCode)); boolQueryBuilder_miss.filter(QueryBuilders.matchQuery("strategy_code",strategyCode)); boolQueryBuilder_release.filter(QueryBuilders.matchQuery("strategy_code",strategyCode)); } if(null != startTime && null != endTime){ boolQueryBuilder_prevent.filter(QueryBuilders.rangeQuery("event_time").to(new DateTime(endTime.getYear(), endTime.getMonthOfYear(), endTime.getDayOfMonth(), 0, 0) .plusDays(1)).from(new DateTime(startTime.getYear(), startTime.getMonthOfYear(), startTime.getDayOfMonth(), 0, 0).plus(1))); boolQueryBuilder_miss.filter(QueryBuilders.rangeQuery("event_time").to(new DateTime(endTime.getYear(), endTime.getMonthOfYear(), endTime.getDayOfMonth(), 0, 0) .plusDays(1)).from(new DateTime(startTime.getYear(), startTime.getMonthOfYear(), startTime.getDayOfMonth(), 0, 0).plus(1))); boolQueryBuilder_release.filter(QueryBuilders.rangeQuery("event_time").to(new DateTime(endTime.getYear(), endTime.getMonthOfYear(), endTime.getDayOfMonth(), 0, 0) .plusDays(1)).from(new DateTime(startTime.getYear(), startTime.getMonthOfYear(), startTime.getDayOfMonth(), 0, 0).plus(1))); } if(!StringUtils.isEmpty(riskLevel)){ if(riskLevel.equals("-1")){ boolQueryBuilder_prevent.filter(QueryBuilders.matchQuery("score",0)); boolQueryBuilder_miss.filter(QueryBuilders.matchQuery("score",0)); boolQueryBuilder_release.filter(QueryBuilders.matchQuery("score",0)); } else{ boolQueryBuilder_prevent.filter(QueryBuilders.matchQuery("risk_level",riskLevel)); boolQueryBuilder_miss.filter(QueryBuilders.matchQuery("risk_level",riskLevel)); boolQueryBuilder_release.filter(QueryBuilders.matchQuery("risk_level",riskLevel)); } } BoolQueryBuilder queryBuilderTmp = QueryBuilders.boolQuery(); queryBuilderTmp.should(QueryBuilders.existsQuery("riskRules")) .should(QueryBuilders.existsQuery("riskRules.0")); boolQueryBuilder_miss .mustNot(queryBuilderTmp); boolQueryBuilder_prevent .filter(QueryBuilders.matchQuery("ret_code","9999")) .filter(QueryBuilders.existsQuery("riskRules.0")); boolQueryBuilder_release .filter(QueryBuilders.matchQuery("ret_code","0000")) .filter(QueryBuilders.existsQuery("riskRules")); searchRequestBuilder_prevent = client.prepareSearch(indexname).setTypes(type).setQuery(boolQueryBuilder_prevent); log.info("boolQueryBuilder_prevent:{}",boolQueryBuilder_prevent); MultiSearchRequestBuilder multiSearchRequestBuilder_prevent = client.prepareMultiSearch(); MultiSearchResponse multiSearchResponse_prevent = multiSearchRequestBuilder_prevent.add(searchRequestBuilder_prevent).execute().actionGet(); Long prevent_hit = 0l; if(null != multiSearchResponse_prevent) { for (MultiSearchResponse.Item response : multiSearchResponse_prevent.getResponses()){ prevent_hit = response.getResponse().getHits().getTotalHits(); } } searchRequestBuilder_miss = client.prepareSearch(indexname).setTypes(type).setQuery(boolQueryBuilder_miss); log.info("boolQueryBuilder_miss:{}",boolQueryBuilder_miss); MultiSearchRequestBuilder multiSearchRequestBuilder_miss = client.prepareMultiSearch(); MultiSearchResponse multiSearchResponse_miss = multiSearchRequestBuilder_miss.add(searchRequestBuilder_miss).execute().actionGet(); Long miss_hit = 0l; if(null != multiSearchRequestBuilder_miss){ for(MultiSearchResponse.Item response : multiSearchResponse_miss.getResponses()){ miss_hit = response.getResponse().getHits().getTotalHits(); } } searchRequestBuilder_release = client.prepareSearch(indexname).setTypes(type).setQuery(boolQueryBuilder_release); log.info("boolQueryBuilder_release:{}",boolQueryBuilder_release); MultiSearchRequestBuilder multiSearchRequestBuilder_release = client.prepareMultiSearch(); MultiSearchResponse multiSearchResponse_release = multiSearchRequestBuilder_release.add(searchRequestBuilder_release).execute().actionGet(); Long release_hit = 0l; if(null != multiSearchRequestBuilder_release){ for(MultiSearchResponse.Item response : multiSearchResponse_release.getResponses()){ release_hit = response.getResponse().getHits().getTotalHits(); } } Long sum_hit = 0l; if(!StringUtils.isEmpty(retCode)){ if(retCode.equals("-1")){ release_hit = 0l; prevent_hit = 0l; sum_hit = miss_hit; } else if(retCode.equals("9999")){ miss_hit = 0l; release_hit = 0l; sum_hit = prevent_hit; } else if(retCode.equals("0000")){ prevent_hit =0l; miss_hit = 0l; sum_hit = release_hit; } } else { sum_hit = miss_hit+release_hit+prevent_hit; } Long time2 = System.currentTimeMillis(); log.debug("count waste time:{}", time2 - time1); String preventProportion = "0.00%"; //阻止比例 String releaseProportion = "0.00%"; //放行比例 String missProportion = "0.00%"; //未命中比例 DecimalFormat df = new DecimalFormat("######0.00"); if(sum_hit!=0){ preventProportion = df.format(((double)prevent_hit/sum_hit)*100)+"%"; releaseProportion = df.format(((double)release_hit/sum_hit)*100)+"%"; missProportion = df.format(((double)miss_hit/sum_hit)*100)+"%"; } riskEventLogCountsAndDetailsDTO.setRiskEventLogCounts(sum_hit); riskEventLogCountsAndDetailsDTO.setMissRiskEventLogCounts(miss_hit); riskEventLogCountsAndDetailsDTO.setPreventRiskEventLogCounts(prevent_hit); riskEventLogCountsAndDetailsDTO.setReleaseRiskEventLogCounts(release_hit); riskEventLogCountsAndDetailsDTO.setPreventProportion(preventProportion); riskEventLogCountsAndDetailsDTO.setMissProportion(missProportion); riskEventLogCountsAndDetailsDTO.setReleaseProportion(releaseProportion); return riskEventLogCountsAndDetailsDTO; }}