ElasticSearch介绍:
使用
① maven依赖导入:
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>6.2.2</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>6.2.2</version> </dependency>
② 工具类编写:
package com.mvs.utils; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Stack; import org.apache.commons.lang3.StringUtils; import org.elasticsearch.action.deletebyquery.DeleteByQueryAction; import org.elasticsearch.action.deletebyquery.DeleteByQueryRequestBuilder; import org.elasticsearch.action.deletebyquery.DeleteByQueryResponse; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.action.support.WriteRequest.RefreshPolicy; import org.elasticsearch.action.update.UpdateRequestBuilder; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.MatchPhraseQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.sort.SortOrder; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.ContextLoader; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.mvs.model.EsSearchVo; import com.mvs.service.ElasticsearchService; @Component @SuppressWarnings("resource") public class ElasticSearchUtils { private static Logger log = LoggerFactory.getLogger(ElasticSearchUtils.class); public static final String CLUSTER_NAME = "XXXXX"; //实例名称 private static final String IP = "XXX.XXX.XXX.XXX"; //public static final String CLUSTER_NAME = "es-zhy"; //实例名称 //private static final String IP = "127.0.0.1"; private static final int PORT = 9300; //端口 private static TransportClient client; //取得实例 public static TransportClient getTransportClient(){ if (client != null) return client; else { try { Settings settings = Settings.builder() .put("cluster.name",CLUSTER_NAME) .put("client.transport.sniff", true) //启动集群嗅探 .build(); client = new PreBuiltTransportClient(settings) .addTransportAddress(new TransportAddress(InetAddress.getByName(IP), PORT)); } catch (UnknownHostException e) { log.error(">>>>>>>>>ES连接初始化失败<<<<<<<<<", e); client = null; } } return client; } /** * 创建索引 * @param indexName 索引名称,相当于数据库名称 * @param typeName 索引类型,相当于数据库中的表名 * @param id id名称,相当于每个表中某一行记录的标识 * @param jsonData json数据 */ public static void createIndex(String indexName, String typeName, String id, Map<String,Object> dataMap) { TransportClient transportClient = getTransportClient(); if(transportClient!=null) { IndexRequestBuilder requestBuilder = transportClient.prepareIndex(indexName, typeName, id).setSource(dataMap); requestBuilder.setRefreshPolicy(RefreshPolicy.IMMEDIATE); requestBuilder.execute().actionGet(); // transportClient.close(); }else { log.error(">>>>>>>>>ES连接初始化失败,创建索引失败<<<<<<<<<"); } } /** * 执行搜索 * @param indexname 索引名称 * @param type 索引类型 * @param queryBuilder 查询条件 * @return */ public static SearchResponse searcher(String indexName, String typeName, QueryBuilder queryBuilder) { TransportClient transportClient = getTransportClient(); SearchResponse searchResponse = transportClient.prepareSearch(indexName) .setTypes(typeName).setQuery(queryBuilder).execute() .actionGet();//执行查询 // transportClient.close(); return searchResponse; } /** * 更新索引 * @param indexName 索引名称 * @param typeName 索引类型 * @param id id名称 * @param jsonData json数据 */ public static void updateIndex(String indexName, String typeName, String id, Map<String,Object> dataMap) { TransportClient transportClient = getTransportClient(); UpdateRequestBuilder updateRequest = transportClient.prepareUpdate(indexName, typeName, id).setDoc(dataMap); updateRequest.setRefreshPolicy(RefreshPolicy.IMMEDIATE); updateRequest.execute().actionGet(); // transportClient.close(); } /** * 根据查询数据更新 * @param indexName 索引名称 * @param typeName 索引类型 * @param flag * @param jsonData json数据 */ public static void updateByQuery(String indexName, String typeName, Map<String,Object> dataMap, boolean flag) { try { //TransportClient transportClient = getTransportClient(); String sql = "select * from notice where itemId='"+dataMap.get("itemId")+" ' and itemKey='"+dataMap.get("itemKey") +" ' and triggerId='"+dataMap.get("triggerId") +" ' and source='"+dataMap.get("source") +" ' and hostIp='"+dataMap.get("hostIp") +" ' and hostName='"+dataMap.get("hostName")+"' and warnStatus<>'CLOSE'"; ElasticsearchService es = (ElasticsearchService) ContextLoader.getCurrentWebApplicationContext().getBean("elasticsearchServiceImpl"); List<Map<String, Object>> query = es.query(sql); log.info("》》》》》》》》》》》The Data Match Count Is:"+query.size()); if(query!=null&&query.size()==1) { log.info("》》》》》》》》》》》The Data Match flag Is:"+flag); if(!flag) { log.info("》》》》》》》》》》》The Data Will Update Close Is:"+JSON.toJSONString(dataMap)); updateIndex(indexName,typeName,query.get(0).get("_id").toString(),dataMap); }else { log.info("》》》》》》》》》》》The Data Will Update Repeat Is:"+JSON.toJSONString(dataMap)); dataMap.put("repeat_count", (Integer)query.get(0).get("repeat_count")+1); updateIndex(indexName,typeName,query.get(0).get("_id").toString(),dataMap); } }else { log.error("》》》》》》》》》》》Can Not Match Data In ES!!!《《《《《《《《《《《"); } } catch (Exception e) { log.error("ES Query Search Failed!!!",e); } } /** * 根据查询数据更新 * @param indexName 索引名称 * @param typeName 索引类型 * @param flag * @param jsonData json数据 */ @SuppressWarnings({ "rawtypes"}) public static void updateByQueryNotice(String indexName, String typeName, Map<String,Object> dataMap, boolean flag) { try { TransportClient transportClient = getTransportClient(); JSONObject jsonObject = (JSONObject) JSONObject.toJSON(dataMap); if(jsonObject!=null&&jsonObject.size()>0) { Set<String> keySet = jsonObject.keySet(); List<MatchPhraseQueryBuilder > dataLst = new ArrayList<>(); for (String key : keySet) { if(key.equals("itemId")||key.equals("itemKey")||key.equals("triggerId")||key.equals("hostName")||key.equals("hostIp")) { dataLst.add(QueryBuilders.matchPhraseQuery(key,jsonObject.get(key))); } } if(dataLst.size()!=5) { log.error(">>>>>>>>>Update Data is Not Right,Pleace Check Out Data Fileds!!!<<<<<<<<<"); }else { QueryBuilder qb = QueryBuilders.boolQuery().must(dataLst.get(0)) .must(dataLst.get(1)) .must(dataLst.get(2)) .must(dataLst.get(3)) .must(dataLst.get(4)); SearchRequestBuilder responsebuilder = transportClient.prepareSearch(indexName).setTypes(typeName); SearchResponse myresponse=responsebuilder.setQuery(qb).execute().actionGet(); if(myresponse!=null) { SearchHits hits = myresponse.getHits(); for (int i = 0; i < hits.getHits().length; i++) { if (null == hits.getHits()[i]) { log.error("ES未查询到任何结果!!!"); } else { if(flag) { log.info("ES Match Data Length Is:"+hits.getTotalHits()); Map map = JSONObject.parseObject(hits.getHits()[i].getSourceAsString(),Map.class); if(map.get("repeat_count")!=null&&StringUtils.isNotEmpty(map.get("repeat_count").toString())) { dataMap.put("repeat_count",(Integer)map.get("repeat_count")+1); updateIndex(indexName,typeName,hits.getHits()[i].getId(),dataMap); } }else { updateIndex(indexName,typeName,hits.getHits()[i].getId(),dataMap); } } } }else { log.error("ES未查询到任何结果!!!"); } } } } catch (Exception e) { log.error("ES Query Search Failed!!!",e); } } /** * 根据查询数据更新 * @param indexName 索引名称 * @param typeName 索引类型 * @param flag * @param jsonData json数据 */ public static void updateByQueryTemp(String indexName, String typeName, Map<String,Object> dataMap) { try { TransportClient transportClient = getTransportClient(); JSONObject jsonObject = (JSONObject) JSONObject.toJSON(dataMap); if(jsonObject!=null&&jsonObject.size()>0) { Set<String> keySet = jsonObject.keySet(); List<MatchPhraseQueryBuilder > dataLst = new ArrayList<>(); for (String key : keySet) { if(key.equals("sourceId")) { dataLst.add(QueryBuilders.matchPhraseQuery(key,jsonObject.get(key))); } } if(dataLst.size()!=1) { log.error(">>>>>>>>>Update Data is Not Right,Pleace Check Out Data Fileds!!!<<<<<<<<<"); }else { QueryBuilder qb = QueryBuilders.boolQuery().must(dataLst.get(0)); SearchRequestBuilder responsebuilder = transportClient.prepareSearch(indexName).setTypes(typeName); SearchResponse myresponse=responsebuilder.setQuery(qb).execute().actionGet(); if(myresponse!=null) { SearchHits hits = myresponse.getHits(); for (int i = 0; i < hits.getHits().length; i++) { if (null == hits.getHits()[i]) { log.error("ES未查询到任何结果!!!"); } else { log.info("ES Match Data Length Is:"+hits.getTotalHits()); updateIndex(indexName,typeName,hits.getHits()[i].getId(),dataMap); } } }else { log.error("ES未查询到任何结果!!!"); } } } } catch (Exception e) { log.error("ES Query Search Failed!!!",e); } } /** * 删除指定索引 * @param indexName * @param typeName * @param id */ public static void deleteIndex(String indexName, String typeName, String id) { TransportClient transportClient = getTransportClient(); transportClient.prepareDelete(indexName, typeName, id).get(); // transportClient.close(); } /** * 判断一个index中的type是否有数据 * @param index * @param type * @return * @throws Exception */ public static Boolean existDocOfType(String index, String type) throws Exception { SearchRequestBuilder builder = client.prepareSearch(index).setTypes(type) .setSearchType(SearchType.QUERY_THEN_FETCH) .setSize(1); SearchResponse response = builder.execute().actionGet(); long docNum = response.getHits().getTotalHits(); if (docNum == 0) { return false; } return true; } /** * 根据type来删除数据 * @param index * @param types * @return */ public static long deleteDocByType(String index, String[] types) { TransportClient transportClient = getTransportClient(); long oldTime = System.currentTimeMillis(); StringBuilder b = new StringBuilder(); b.append("{\"query\":{\"match_all\":{}}}"); DeleteByQueryResponse response = new DeleteByQueryRequestBuilder(transportClient, DeleteByQueryAction.INSTANCE) .setIndices(index).setTypes(types) .setSource(b.toString()) .execute().actionGet(); Stack<String> allTypes = new Stack<String>(); for(String type : types){ allTypes.add(type); } while(!allTypes.isEmpty()){ String type = allTypes.pop(); while(true){ try { if (existDocOfType(index, type) == false) { break; } } catch (Exception e) { log.error("queryError: " + e.getMessage()); } } } System.out.println(System.currentTimeMillis() - oldTime); return response.getTotalDeleted(); } /** * 分页查询 * @param index * @param types * @return */ public static EsSearchVo findByPage(String indexName, Integer size,Integer pageNum,String sortField,QueryBuilder queryBuilder) { EsSearchVo vo = new EsSearchVo(); TransportClient transportClient = getTransportClient(); SearchResponse res = null; SearchResponse searchResponse = transportClient.prepareSearch(indexName) .setQuery(queryBuilder) .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)//这种方式返回的document与用户要求的size是相等的。 .setSize(size) .addSort(sortField, SortOrder.DESC) .setExplain(true)// 设置是否按查询匹配度排序 .setScroll(new TimeValue(20000)).execute() //设置TimeValue表示需要保持搜索的上下文时间。 .actionGet();//注意:首次搜索已经包含数据 //获取总数量 long totalCount = searchResponse.getHits().getTotalHits(); vo.setTotal(totalCount); int page = 0; int pageCount=0; if(totalCount%size==0) { pageCount = (int)totalCount/(size); }else { pageCount = (int)totalCount/(size)+1; } if(totalCount<size) { page = 1; }else { page=(int)totalCount/(size); } log.info("*************************ES Page Query Size Number is:"+pageCount+"************************"); log.info("*************************ES Page Query Match Data Number is:"+totalCount+"************************"); for (int i = 1; i <=page; i++) { if(pageNum-1==0) { res = searchResponse; break; }else if(pageNum-1==i){ //再次发送请求,并使用上次搜索结果的ScrollId res = transportClient.prepareSearchScroll(searchResponse.getScrollId()) .setScroll(new TimeValue(20000)).execute() .actionGet(); break; }else { searchResponse = transportClient.prepareSearchScroll(searchResponse.getScrollId()) .setScroll(new TimeValue(20000)).execute() .actionGet(); } } vo.setSr(res); return vo; } /** * 分页查询全部 * @param index * @param types * @return */ /*public static void findAllBySize(String indexName, Integer size,String sortField) { TransportClient transportClient = getTransportClient(); SearchResponse searchResponse = transportClient.prepareSearch(indexName) .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)//这种方式返回的document与用户要求的size是相等的。 .setSize(size) .addSort(sortField, SortOrder.DESC) .setExplain(true)// 设置是否按查询匹配度排序 .setScroll(new TimeValue(20000)).execute() //设置TimeValue表示需要保持搜索的上下文时间。 .actionGet();//注意:首次搜索已经包含数据 //获取总数量 long totalCount = searchResponse.getHits().getTotalHits(); int page = 0; page=(int)totalCount/(size); System.out.println(page); System.out.println(totalCount); for (int i = 0; i <=page; i++) { if(i==0) { parseSearchResponse(searchResponse); }else { //再次发送请求,并使用上次搜索结果的ScrollId searchResponse = transportClient.prepareSearchScroll(searchResponse.getScrollId()) .setScroll(new TimeValue(20000)).execute() .actionGet(); parseSearchResponse(searchResponse); } } } public static void parseSearchResponse(SearchResponse searchResponse) { SearchHits hits = searchResponse.getHits(); int i = 0; System.out.println("-----------begin------------"); for (SearchHit searchHit : hits.getHits()) { try { i++; //String id = searchHit.getId(); System.out.println("第" + i + "条数据:" +searchHit.getSourceAsString() ); } catch (Exception e) { e.printStackTrace(); } } System.out.println("-----------end------------"); } */ }
注意事项
/** * 创建索引 * @param indexName 索引名称,相当于数据库名称 * @param typeName 索引类型,相当于数据库中的表名 * @param id id名称,相当于每个表中某一行记录的标识 * @param jsonData json数据 */ public static void createIndex(String indexName, String typeName, String id, Map<String,Object> dataMap) { TransportClient transportClient = getTransportClient(); if(transportClient!=null) { IndexRequestBuilder requestBuilder = transportClient.prepareIndex(indexName, typeName, id).setSource(dataMap); requestBuilder.setRefreshPolicy(RefreshPolicy.IMMEDIATE); requestBuilder.execute().actionGet(); // transportClient.close(); }else { log.error(">>>>>>>>>ES连接初始化失败,创建索引失败<<<<<<<<<"); } }
ElasticSearchUtils.createIndex(indexName, indexName, null, tempMap);
//取得实例 public static TransportClient getTransportClient(){ if (client != null) return client; else { try { Settings settings = Settings.builder() .put("cluster.name",CLUSTER_NAME) .put("client.transport.sniff", true) //启动集群嗅探 .build(); client = new PreBuiltTransportClient(settings) .addTransportAddress(new TransportAddress(InetAddress.getByName(IP), PORT)); } catch (UnknownHostException e) { log.error(">>>>>>>>>ES连接初始化失败<<<<<<<<<", e); client = null; } } return client; }
/** * 分页查询 * @param index * @param types * @return */ public static EsSearchVo findByPage(String indexName, Integer size,Integer pageNum,String sortField,QueryBuilder queryBuilder) { EsSearchVo vo = new EsSearchVo(); TransportClient transportClient = getTransportClient(); SearchResponse res = null; SearchResponse searchResponse = transportClient.prepareSearch(indexName) .setQuery(queryBuilder) .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)//这种方式返回的document与用户要求的size是相等的。 .setSize(size) .addSort(sortField, SortOrder.DESC) .setExplain(true)// 设置是否按查询匹配度排序 .setScroll(new TimeValue(20000)).execute() //设置TimeValue表示需要保持搜索的上下文时间。 .actionGet();//注意:首次搜索已经包含数据 //获取总数量 long totalCount = searchResponse.getHits().getTotalHits(); vo.setTotal(totalCount); int page = 0; int pageCount=0; if(totalCount%size==0) { pageCount = (int)totalCount/(size); }else { pageCount = (int)totalCount/(size)+1; } if(totalCount<size) { page = 1; }else { page=(int)totalCount/(size); } log.info("*************************ES Page Query Size Number is:"+pageCount+"************************"); log.info("*************************ES Page Query Match Data Number is:"+totalCount+"************************"); for (int i = 1; i <=page; i++) { if(pageNum-1==0) { res = searchResponse; break; }else if(pageNum-1==i){ //再次发送请求,并使用上次搜索结果的ScrollId res = transportClient.prepareSearchScroll(searchResponse.getScrollId()) .setScroll(new TimeValue(20000)).execute() .actionGet(); break; }else { searchResponse = transportClient.prepareSearchScroll(searchResponse.getScrollId()) .setScroll(new TimeValue(20000)).execute() .actionGet(); } } vo.setSr(res); return vo; }
if(totalCount<size) { page = 1; }else { page=(int)totalCount/(size); }
⑤ ES新建索引也就是新增数据的流程中如果伴随着查询操作的话,那么你的自增操作必须加上更新策略支持,不然在此流程中查 询是 获取不到数据的,常用策略有RefreshPolicy.IMMEDIATE(更新策略为立即更新),RefreshPolicy.NONE(更新策略为默认,也就是每几秒执行一次批量更行,这是ES的默认策略),RefreshPolicy.WAIT_UNTIL(这个暂时不清楚,字面意识是等待什么操作完成)。ElasticSearch 实际上是伪实时的,所有分片之间默认1s同步更新
③ 使用
@SuppressWarnings("unchecked") private Map<String, Object> inserEsFirst(ConfigVo configVo, AlertWarnVo alertWarnVo, String indexName) { Map<String,Object> resultMap = new HashMap<>(); //用来关联元数据与丰富过后的数据的标识符 String sourceId = new SimpleDateFormat("yyyyMMddhhmmssSSS").format(new Date()); boolean flag = true; try { //如果告警状态没有,强制设置为open if(alertWarnVo.getEventValue()==null||StringUtils.isEmpty(alertWarnVo.getEventValue().toString())) { alertWarnVo.setWarnStatus("OPEN"); }else if("0".equals(alertWarnVo.getEventValue())) { alertWarnVo.setWarnStatus("CLOSE"); }else if("1".equals(alertWarnVo.getEventValue())) { alertWarnVo.setWarnStatus("OPEN"); } Map<String, Object> tempMap = (Map<String, Object>) JSON.parse(JSON.toJSONString(alertWarnVo)); tempMap.put("source", configVo.getDataSource()); //设置默认状态过滤标识位为false tempMap.put("isFilter", false); tempMap.put("sourceId", sourceId); resultMap.put("sourceId", sourceId); ElasticSearchUtils.createIndex(indexName, indexName, null, tempMap); } catch (Exception e) { log.error(">>>>>>>>>Es Data Insert Failed!!!<<<<<<<<<", e); flag =false; } resultMap.put("flag", flag); return resultMap; } @SuppressWarnings("unchecked") private Map<String,Object> updateESFilter(ConfigVo configVo, AlertWarnVo o,String indexName) { Map<String,Object> resultMap = new HashMap<>(); boolean flag = true; try { Map<String, Object> tempMap = (Map<String, Object>) JSON.parse(JSON.toJSONString(o)); //根据sourceId存在修改 if(tempMap.get("sourceId")!=null&&StringUtils.isNotEmpty(tempMap.get("sourceId").toString())) { tempMap.put("isFilter", true); //indexName与typeName一样 ElasticSearchUtils.updateByQueryTemp(indexName, indexName, tempMap); }else { log.error(">>>>>>>>>Es Data Update Failed Cause SourceId Is Empty!!!<<<<<<<<<" ); flag =false; } } catch (Exception e) { log.error(">>>>>>>>>Es Data Update Failed!!!<<<<<<<<<", e); flag =false; } resultMap.put("flag", flag); return resultMap; }
@Override public Map<String, Object> queryBaseInfo() { Map<String, Object> dataMap = new HashMap<>(); try { Calendar baseCal = Calendar.getInstance(); baseCal.set(Calendar.HOUR_OF_DAY,0); baseCal.set(Calendar.MINUTE, 0); baseCal.set(Calendar.SECOND, 0); baseCal.add(Calendar.DATE,0); //查询Disaster数据,CLOSED数据不算其中 SearchResponse searcherDisaster = ElasticSearchUtils.searcher(PUtils.getString("es.index.notice"), PUtils.getString("es.index.notice"), QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("severity", "Disaster")) .must(QueryBuilders.rangeQuery("eventTime").gt(baseCal.getTimeInMillis())) .mustNot(QueryBuilders.matchQuery("warnStatus", "CLOSED"))); if(searcherDisaster!=null&&searcherDisaster.getHits().getTotalHits()!=0) { dataMap.put("DisasterCount", searcherDisaster.getHits().getTotalHits()); }else { dataMap.put("DisasterCount", 0); } //查询High数据,CLOSED数据不算其中 SearchResponse searcherHigh = ElasticSearchUtils.searcher(PUtils.getString("es.index.notice"), PUtils.getString("es.index.notice"), QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("severity", "High")) .must(QueryBuilders.rangeQuery("eventTime").gt(baseCal.getTimeInMillis())) .mustNot(QueryBuilders.matchQuery("warnStatus", "CLOSED"))); if(searcherHigh!=null&&searcherHigh.getHits().getTotalHits()!=0) { dataMap.put("HighCount", searcherHigh.getHits().getTotalHits()); }else { dataMap.put("HighCount", 0); } //查询Average数据,CLOSED数据不算其中 SearchResponse searcherAverage= ElasticSearchUtils.searcher(PUtils.getString("es.index.notice"), PUtils.getString("es.index.notice"), QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("severity", "Average")) .must(QueryBuilders.rangeQuery("eventTime").gt(baseCal.getTimeInMillis())) .mustNot(QueryBuilders.matchQuery("warnStatus", "CLOSED"))); if(searcherAverage!=null&&searcherAverage.getHits().getTotalHits()!=0) { dataMap.put("AverageCount", searcherAverage.getHits().getTotalHits()); }else { dataMap.put("AverageCount", 0); } //查询Warning数据,CLOSED数据不算其中 SearchResponse searcherWarning= ElasticSearchUtils.searcher(PUtils.getString("es.index.notice"), PUtils.getString("es.index.notice"), QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("severity", "Warning")) .must(QueryBuilders.rangeQuery("eventTime").gt(baseCal.getTimeInMillis())) .mustNot(QueryBuilders.matchQuery("warnStatus", "CLOSED"))); if(searcherWarning!=null&&searcherWarning.getHits().getTotalHits()!=0) { dataMap.put("WarningCount", searcherWarning.getHits().getTotalHits()); }else { dataMap.put("WarningCount", 0); } //查询Not Classified数据,CLOSED数据不算其中 SearchResponse searcherNotClassified= ElasticSearchUtils.searcher(PUtils.getString("es.index.notice"), PUtils.getString("es.index.notice"), QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("severity", "Not Classified")) .must(QueryBuilders.rangeQuery("eventTime").gt(baseCal.getTimeInMillis())) .mustNot(QueryBuilders.matchQuery("warnStatus", "CLOSED"))); if(searcherNotClassified!=null&&searcherNotClassified.getHits().getTotalHits()!=0) { dataMap.put("NotClassifiedCount", searcherNotClassified.getHits().getTotalHits()); }else { dataMap.put("NotClassifiedCount", 0); } //查询Information数据,CLOSED数据不算其中 SearchResponse searcherInformation= ElasticSearchUtils.searcher(PUtils.getString("es.index.notice"), PUtils.getString("es.index.notice"), QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("severity", "Information")) .must(QueryBuilders.rangeQuery("eventTime").gt(baseCal.getTimeInMillis())) .mustNot(QueryBuilders.matchQuery("warnStatus", "CLOSED"))); if(searcherInformation!=null&&searcherInformation.getHits().getTotalHits()!=0) { dataMap.put("InformationCount", searcherInformation.getHits().getTotalHits()); }else { dataMap.put("InformationCount", 0); } //查询近7天告警总数数据,CLOSED数据不算其中 List<Long> eventsLst = new ArrayList<>(); for(int i=0;i<7;i++) { RangeQueryBuilder rangequerybuilder = null; if(i==6) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY,0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.add(Calendar.DATE,(i-6)); rangequerybuilder = QueryBuilders.rangeQuery("eventTime").gt(cal.getTimeInMillis()); }else { Calendar cal1 = Calendar.getInstance(); cal1.set(Calendar.HOUR_OF_DAY,0); cal1.set(Calendar.MINUTE, 0); cal1.set(Calendar.SECOND, 0); cal1.add(Calendar.DATE,(i-6)); Calendar cal2 = Calendar.getInstance(); cal2.set(Calendar.HOUR_OF_DAY,0); cal2.set(Calendar.MINUTE, 0); cal2.set(Calendar.SECOND, 0); cal2.add(Calendar.DATE,(i-5)); rangequerybuilder = QueryBuilders.rangeQuery("eventTime").gt(cal1.getTimeInMillis()).lt(cal2.getTimeInMillis()); } SearchResponse searcher = ElasticSearchUtils.searcher(PUtils.getString("es.index.notice"), PUtils.getString("es.index.notice"), rangequerybuilder); if(searcher!=null&&searcher.getHits().getTotalHits()!=0) { eventsLst.add(searcher.getHits().getTotalHits()); }else { eventsLst.add(0L); } } dataMap.put("eventsLst", eventsLst); } catch (Exception e) { e.printStackTrace(); logger.error(">>>>>>>>>Query ES Base Source Has failed!!!<<<<<<<<<", e); dataMap=null; } return dataMap; } @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public List<Map<String, Object>> queryAllEvents(Integer pageNum, Integer pageSize) { List<Map<String, Object>> dataLst = new ArrayList<>(); try { EsSearchVo vo = ElasticSearchUtils.findByPage(PUtils.getString("es.index.notice"),pageSize,pageNum,"eventTime", QueryBuilders.boolQuery() .must(QueryBuilders.matchAllQuery())); if(vo!=null&&vo.getSr()!=null) { SearchResponse searcher = vo.getSr(); logger.info("******************Total Match Sources Are:"+searcher.getHits().getTotalHits()+"********************"); SearchHits hits = searcher.getHits(); for (SearchHit searchHit : hits.getHits()) { if(searchHit.getSourceAsString()!=null&&searchHit.getSourceAsString().length()>0) { Map parseMap = JSON.parseObject(searchHit.getSourceAsString(), Map.class); parseMap.put("page", pageNum); parseMap.put("size", pageSize); parseMap.put("total", vo.getTotal()==null?0:vo.getTotal()); dataLst.add(parseMap); } } }else { logger.info("******************No Source Matched In ES!!!!********************"); } } catch (Exception e) { e.printStackTrace(); logger.error("****************** Query All Es Events Failed,Cause: ********************",e); dataLst=null; } return dataLst; } @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public List<Map<String, Object>> queryCloseEvents(Integer pageNum, Integer pageSize) { List<Map<String, Object>> dataLst = new ArrayList<>(); try { EsSearchVo vo = ElasticSearchUtils.findByPage(PUtils.getString("es.index.notice"),pageSize,pageNum,"eventTime", QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("warnStatus","CLOSED"))); if(vo!=null&&vo.getSr()!=null) { SearchResponse searcher = vo.getSr(); logger.info("******************Closed Match Sources Are:"+searcher.getHits().getTotalHits()+"********************"); SearchHits hits = searcher.getHits(); for (SearchHit searchHit : hits.getHits()) { if(searchHit.getSourceAsString()!=null&&searchHit.getSourceAsString().length()>0) { Map parseMap = JSON.parseObject(searchHit.getSourceAsString(), Map.class); parseMap.put("page", pageNum); parseMap.put("size", pageSize); parseMap.put("total", vo.getTotal()==null?0:vo.getTotal()); dataLst.add(parseMap); } } } } catch (Exception e) { e.printStackTrace(); logger.error("****************** Query Closed Es Events Failed,Cause: ********************",e); dataLst=null; } return dataLst; } @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public List<Map<String, Object>> queryOpenEvents(Integer pageNum, Integer pageSize) { List<Map<String, Object>> dataLst = new ArrayList<>(); try { EsSearchVo vo = ElasticSearchUtils.findByPage(PUtils.getString("es.index.notice"),pageSize,pageNum,"eventTime", QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("warnStatus","OPEN"))); if(vo!=null&&vo.getSr()!=null) { SearchResponse searcher = vo.getSr(); logger.info("******************Open Match Sources Are:"+searcher.getHits().getTotalHits()+"********************"); SearchHits hits = searcher.getHits(); for (SearchHit searchHit : hits.getHits()) { if(searchHit.getSourceAsString()!=null&&searchHit.getSourceAsString().length()>0) { Map parseMap = JSON.parseObject(searchHit.getSourceAsString(), Map.class); parseMap.put("page", pageNum); parseMap.put("size", pageSize); parseMap.put("total", vo.getTotal()==null?0:vo.getTotal()); dataLst.add(parseMap); } } } } catch (Exception e) { e.printStackTrace(); logger.error("****************** Query Open Es Events Failed,Cause: ********************",e); dataLst=null; } return dataLst; }
总结:
ES 的ClusterName相当于就是一个数据库mysql,indexName相当于他的库名,typeName相当于是表名,_id相当于此表的主键,当然你也可以自定义主键来完成相应的需求,它的效率与mysql在大数据量中相比要强大N倍。
文章来源: Elastic Search(ES)使用笔记