Elastic Search(ES)使用笔记

匿名 (未验证) 提交于 2019-12-03 00:36:02

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倍。


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!