es通用工具类ElasticSearchUtil
最近也是搭了一套elk+rabbitmq的日志系统,搬过来大哥编写的工具类
public class ElasticSearchUtil { private static final Logger logger = LoggerFactory.getLogger(ElasticSearchUtil.class); /** * 创建索引 * * @param index * @return */ public static boolean createIndex(String index) { if (!isIndexExist(index)) { logger.info("Index is not exits!"); } CreateIndexResponse indexresponse = null; try { indexresponse = EsClient.getTransportClient().admin().indices().prepareCreate(index).execute() .actionGet(); } catch (Exception e) { e.printStackTrace(); } logger.info("执行建立成功?" + indexresponse.isAcknowledged()); return indexresponse.isAcknowledged(); } /** * 删除索引 * * @param index * @return */ public static boolean deleteIndex(String index) { if (!isIndexExist(index)) { logger.info("Index is not exits!"); } DeleteIndexResponse dResponse = EsClient.getTransportClient().admin().indices().prepareDelete(index).execute().actionGet(); if (dResponse.isAcknowledged()) { logger.info("delete index " + index + " successfully!"); } else { logger.info("Fail to delete index " + index); } return dResponse.isAcknowledged(); } /** * 判断索引是否存在 * * @param index * @return */ public static boolean isIndexExist(String index) { IndicesExistsResponse inExistsResponse = EsClient.getTransportClient().admin().indices().exists(new IndicesExistsRequest (index)).actionGet(); if (inExistsResponse.isExists()) { logger.info("Index [" + index + "] is exist!"); } else { logger.info("Index [" + index + "] is not exist!"); } return inExistsResponse.isExists(); } /** * 数据添加,正定ID * * @param jsonObject 要增加的数据 * @param index 索引,类似数据库 * @param type 类型,类似表 * @param id 数据ID * @return */ public static String addData(JSONObject jsonObject, String index, String type, String id) { IndexResponse response = EsClient.getTransportClient().prepareIndex(index, type, id).setSource(jsonObject).get(); logger.info("addData response status:{},id:{}", response.status().getStatus(), response.getId()); return response.getId(); } /** * 数据添加 * * @param jsonObject 要增加的数据 * @param index 索引,类似数据库 * @param type 类型,类似表 * @return */ public static String addData(JSONObject jsonObject, String index, String type) { return addData(jsonObject, index, type, UUID.randomUUID().toString().replaceAll("-", "").toUpperCase()); } /** * 通过ID删除数据 * * @param index 索引,类似数据库 * @param type 类型,类似表 * @param id 数据ID */ public static void deleteDataById(String index, String type, String id) { DeleteResponse response = EsClient.getTransportClient().prepareDelete(index, type, id).execute().actionGet(); logger.info("deleteDataById response status:{},id:{}", response.status().getStatus(), response.getId()); } /** * 通过ID 更新数据 * * @param jsonObject 要增加的数据 * @param index 索引,类似数据库 * @param type 类型,类似表 * @param id 数据ID * @return */ public static void updateDataById(JSONObject jsonObject, String index, String type, String id) { UpdateRequest updateRequest = new UpdateRequest(); updateRequest.index(index).type(type).id(id).doc(jsonObject); EsClient.getTransportClient().update(updateRequest); } /** * 通过ID获取数据 * * @param index 索引,类似数据库 * @param type 类型,类似表 * @param id 数据ID * @param fields 需要显示的字段,逗号分隔(缺省为全部字段) * @return */ public static Map<String, Object> searchDataById(String index, String type, String id, String fields) { GetRequestBuilder getRequestBuilder = EsClient.getTransportClient().prepareGet(index, type, id); if (StringUtils.isNotEmpty(fields)) { getRequestBuilder.setFetchSource(fields.split(","), null); } GetResponse getResponse = getRequestBuilder.execute().actionGet(); return getResponse.getSource(); } /** * 使用分词查询不分页 * * @param index 索引名称 * @param type 类型名称,可传入多个type逗号分隔 * @param startTime 开始时间 * @param endTime 结束时间 * @param size 文档大小限制 * @param fields 需要显示的字段,逗号分隔(缺省为全部字段) * @param sortField 排序字段 * @param highlightField 高亮字段 * @param operatorTag 查询条件最外层的关系(true与,false或) * @param parmStr 过滤条件 * @return */ public static List<Map<String, Object>> searchListData(String index, String type, Integer size,long startTime, long endTime, String fields, String logType, String sortField, String highlightField, boolean operatorTag, String... parmStr) { SearchRequestBuilder searchRequestBuilder = EsClient.getTransportClient().prepareSearch(index); if (StringUtils.isNotEmpty(type)) { searchRequestBuilder.setTypes(type.split(",")); } BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); if (startTime > 0 && endTime > 0) { boolQuery.must(QueryBuilders.rangeQuery("createDate").format("epoch_millis").from(startTime).to(endTime) .includeLower(true).includeUpper(false)); } //设置查询日志类型 boolQuery.must(QueryBuilders.matchQuery("logType", logType)); // 查询字段 与关系 for (int i = 0, len = parmStr.length; i < len; i++) { BoolQueryBuilder tempBoolQuery = QueryBuilders.boolQuery(); if (parmStr[i].contains("&&")){ String[] tempStr =parmStr[i].split("&&"); for(int j=0,len1=tempStr.length;j<len1;j++) { String[] ss = tempStr[j].split("="); //分词查询 tempBoolQuery.must(QueryBuilders.matchPhraseQuery(ss[0], ss[1])); } if (operatorTag) { //如果为真则最外层是与关系 boolQuery.must(tempBoolQuery); } else { boolQuery.should(tempBoolQuery); } } else { if (parmStr[i].contains(",,")) { String[] tempStr =parmStr[i].split(",,"); for(int j=0,len1=tempStr.length;j<len1;j++) { String[] ss = tempStr[j].split("="); //分词查询 tempBoolQuery.should(QueryBuilders.matchPhraseQuery(ss[0], ss[1])); } if (operatorTag) { //如果为真则最外层是与关系 boolQuery.must(tempBoolQuery); } else { boolQuery.should(tempBoolQuery); } } else { if(ToolUtil.isNotEmpty(parmStr[i])) { String[] ss = parmStr[i].split("="); if (operatorTag) { //如果为真则最外层是与关系 boolQuery.must(QueryBuilders.matchPhraseQuery(ss[0], ss[1])); } else { boolQuery.should(QueryBuilders.matchPhraseQuery(ss[0], ss[1])); } } } } } if (StringUtils.isNotEmpty(highlightField)) { HighlightBuilder highlightBuilder = new HighlightBuilder(); // 设置高亮字段 highlightBuilder.field(highlightField); searchRequestBuilder.highlighter(highlightBuilder); } searchRequestBuilder.setQuery(boolQuery); if (StringUtils.isNotEmpty(fields)) { searchRequestBuilder.setFetchSource(fields.split(","), null); } searchRequestBuilder.setFetchSource(true); if (StringUtils.isNotEmpty(sortField)) { searchRequestBuilder.addSort(sortField, SortOrder.DESC); } if (size != null && size > 0) { searchRequestBuilder.setSize(size); } //打印的内容 可以在 Elasticsearch head 和 Kibana 上执行查询 logger.info("\n{}", searchRequestBuilder); SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); long totalHits = searchResponse.getHits().totalHits; long length = searchResponse.getHits().getHits().length; logger.info("共查询到[{}]条数据,处理数据条数[{}]", totalHits, length); if (searchResponse.status().getStatus() == 200) { // 解析对象 return setSearchResponse(searchResponse, highlightField); } return null; } /** * 使用分词查询,并分页 * * @param index 索引名称 * @param type 类型名称,可传入多个type逗号分隔 * @param currentPage 当前页 * @param pageSize 每页显示条数 * @param startTime 开始时间 * @param endTime 结束时间 * @param fields 需要显示的字段,逗号分隔(缺省为全部字段) * @param sortField 排序字段 * @param highlightField 高亮字段 * @param operatorTag 外层逻辑与true 或false * @param parmStr 内层逻辑与&& 或|| * @return */ public static EsPage searchDataPage(String index, String type, int currentPage, int pageSize, long startTime, long endTime, String fields, String logType, String sortField, String highlightField, boolean operatorTag, String... parmStr) { SearchRequestBuilder searchRequestBuilder = EsClient.getTransportClient().prepareSearch(index); if (StringUtils.isNotEmpty(type)) { searchRequestBuilder.setTypes(type.split(",")); } searchRequestBuilder.setSearchType(SearchType.QUERY_THEN_FETCH); // 需要显示的字段,逗号分隔(缺省为全部字段) if (StringUtils.isNotEmpty(fields)) { searchRequestBuilder.setFetchSource(fields.split(","), null); } //排序字段 if (StringUtils.isNotEmpty(sortField)) { searchRequestBuilder.addSort(sortField, SortOrder.DESC); } BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); if (startTime > 0 && endTime > 0) { boolQuery.must(QueryBuilders.rangeQuery("createDate").format("epoch_millis").from(startTime).to(endTime) .includeLower(true).includeUpper(true)); } //设置查询日志类型 boolQuery.must(QueryBuilders.matchQuery("logType", logType)); // 查询字段 与关系 for (int i = 0, len = parmStr.length; i < len; i++) { BoolQueryBuilder tempBoolQuery = QueryBuilders.boolQuery(); if (parmStr[i].contains("&&")) { String[] tempStr =parmStr[i].split("&&"); for(int j=0,len1=tempStr.length;j<len1;j++) { String[] ss = tempStr[j].split("="); //分词查询 tempBoolQuery.must(QueryBuilders.matchPhraseQuery(ss[0], ss[1])); } if (operatorTag) { //如果为真则最外层是与关系 boolQuery.must(tempBoolQuery); } else { boolQuery.should(tempBoolQuery); } } else { if (parmStr[i].contains(",,")) { String[] tempStr =parmStr[i].split(",,"); for(int j=0,len1=tempStr.length;j<len1;j++) { String[] ss = tempStr[j].split("="); //分词查询 tempBoolQuery.should(QueryBuilders.matchPhraseQuery(ss[0], ss[1])); } if (operatorTag) { //如果为真则最外层是与关系 boolQuery.must(tempBoolQuery); } else { boolQuery.should(tempBoolQuery); } } else { if(ToolUtil.isNotEmpty(parmStr[i])) { String[] ss = parmStr[i].split("="); if (operatorTag) { //如果为真则最外层是与关系 boolQuery.must(QueryBuilders.matchPhraseQuery(ss[0], ss[1])); } else { boolQuery.should(QueryBuilders.matchPhraseQuery(ss[0], ss[1])); } } } } } if (StringUtils.isNotEmpty(highlightField)) { HighlightBuilder highlightBuilder = new HighlightBuilder(); //highlightBuilder.preTags("<span style='color:red' >");//设置前缀 //highlightBuilder.postTags("</span>");//设置后缀 // 设置高亮字段 highlightBuilder.field(highlightField); searchRequestBuilder.highlighter(highlightBuilder); } searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery()); searchRequestBuilder.setQuery(boolQuery); // 分页应用 int num = (currentPage - 1) * pageSize; searchRequestBuilder.setFrom(num).setSize(pageSize); // 设置是否按查询匹配度排序 searchRequestBuilder.setExplain(true); //打印的内容 可以在 Elasticsearch head 和 Kibana 上执行查询 logger.info("\n{}", searchRequestBuilder); // 执行搜索,返回搜索响应信息 SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); long totalHits = searchResponse.getHits().totalHits; long length = searchResponse.getHits().getHits().length; logger.debug("共查询到[{}]条数据,处理数据条数[{}]", totalHits, length); if (searchResponse.status().getStatus() == 200) { // 解析对象 List<Map<String, Object>> sourceList = setSearchResponse(searchResponse, highlightField); return new EsPage(currentPage, pageSize, (int) totalHits, sourceList); } return null; } /** * 高亮结果集 特殊处理 * * @param searchResponse * @param highlightField */ public static List<Map<String, Object>> setSearchResponse(SearchResponse searchResponse, String highlightField) { List<Map<String, Object>> sourceList = new ArrayList<Map<String, Object>>(); StringBuffer stringBuffer = new StringBuffer(); for (SearchHit searchHit : searchResponse.getHits().getHits()) { searchHit.getSourceAsMap().put("_id", searchHit.getId()); if (StringUtils.isNotEmpty(highlightField)) { System.out.println("遍历 高亮结果集,覆盖 正常结果集" + searchHit.getSourceAsMap()); Text[] text = searchHit.getHighlightFields().get(highlightField).getFragments(); if (text != null) { for (Text str : text) { stringBuffer.append(str.string()); } //遍历 高亮结果集,覆盖 正常结果集 searchHit.getSourceAsMap().put(highlightField, stringBuffer.toString()); } } sourceList.add(searchHit.getSourceAsMap()); } return sourceList; } /** * 查询所有数据 * * @param index 索引名称 * @param type type 6.0后不推荐使用 * @param fields 需要显示的字段 * @param sortField 需要进行排序的字段 * @param highlightField 需要高亮的字段 * @param queryBuilder 查询条件 * @return */ public static List<Map<String, Object>> searchAllData(String index, String type, String fields, String sortField, String highlightField, QueryBuilder queryBuilder ) { //指定一个index和type EsClient esClient=new EsClient(); SearchRequestBuilder searchRequestBuilder = esClient.getESClient().prepareSearch(index); // 高亮(xxx=111,aaa=222) if (StringUtils.isNotEmpty(highlightField)) { HighlightBuilder highlightBuilder = new HighlightBuilder(); //设置前缀 highlightBuilder.preTags("<span style='color:red;font-weight:bold'>"); //设置后缀 highlightBuilder.postTags("</span>"); // 设置高亮字段 highlightBuilder.field(highlightField); searchRequestBuilder.highlighter(highlightBuilder); } // 需要显示的字段,逗号分隔(缺省为全部字段) if (StringUtils.isNotEmpty(fields)) { searchRequestBuilder.setFetchSource(fields.split(","), null); } searchRequestBuilder.setFetchSource(true); if (StringUtils.isNotEmpty(sortField)) { searchRequestBuilder.addSort(sortField, SortOrder.ASC); } //设置每批读取的数据量 searchRequestBuilder.setSize(100); //查询条件 searchRequestBuilder.setQuery(queryBuilder); //设置 search context 维护1分钟的有效期 searchRequestBuilder.setScroll(TimeValue.timeValueMinutes(1)); //获得首次的查询结果 SearchResponse scrollResp=searchRequestBuilder.get(); //打印的内容 可以在 Elasticsearch head 和 Kibana 上执行查询 logger.info("\n{}", searchRequestBuilder); //打印命中数量 logger.info("命中总数量:{}", scrollResp.getHits().getTotalHits()); List<Map<String, Object>> sourceList = new ArrayList<Map<String, Object>>(); StringBuffer stringBuffer = new StringBuffer(); do { //将scorllId循环传递 scrollResp = EsClient.getTransportClient().prepareSearchScroll(scrollResp.getScrollId()).setScroll(TimeValue.timeValueMinutes(1)).execute().actionGet(); for (SearchHit searchHit : scrollResp.getHits().getHits()) { searchHit.getSourceAsMap().put("id", searchHit.getId()); if (StringUtils.isNotEmpty(highlightField)) { if (!ToolUtil.isEmpty(searchHit.getHighlightFields().get(highlightField))) { Text[] text = searchHit.getHighlightFields().get(highlightField).getFragments(); if (text != null) { for (Text str : text) { stringBuffer.append(str.string()); } //遍历 高亮结果集,覆盖 正常结果集 searchHit.getSourceAsMap().put(highlightField, stringBuffer.toString()); } } } sourceList.add(searchHit.getSourceAsMap()); } //当searchHits的数组为空的时候结束循环,至此数据全部读取完毕 } while(scrollResp.getHits().getHits().length != 0); //删除scroll ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); clearScrollRequest.addScrollId(scrollResp.getScrollId()); EsClient.getTransportClient().clearScroll(clearScrollRequest).actionGet(); return sourceList; } /** * 批量新增数据 * * @param index 索引名称 * @param type 索引类型 * @param dataList 需要新增的数据 */ public static void insertBatch(String index, String type, List<Map<String, Object>> dataList,int batchSize) { BulkRequestBuilder bulkRequest = EsClient.getTransportClient().prepareBulk(); for (int i = 0; i < dataList.size(); i++) { bulkRequest.add(EsClient.getTransportClient().prepareIndex(index, type, Convert.toStr(dataList.get(i).get("id"))).setSource(dataList.get(i))); // 每5000条提交一次 if ((i + 1) % batchSize == 0) { BulkResponse bulkItemResponses = bulkRequest.execute().actionGet(); bulkRequest = EsClient.getTransportClient().prepareBulk(); logger.info("已保存: {} 条,执行时间:{} ", batchSize, bulkItemResponses.getTook()); } } if(dataList.size()%batchSize !=0){ BulkResponse bulkItemResponses = bulkRequest.execute().actionGet(); logger.info("保存: {}条,执行时间:{} ", dataList.size() % batchSize, bulkItemResponses.getTook()); } } }
有需要的自己直接搬走,不谢
之前忘记了EsClient 这个类,好久没注意,重新补上
@Component public class EsClient { private static final Logger logger = LoggerFactory.getLogger(EsClient.class); private static TransportClient transportClient; public static TransportClient getTransportClient() { return transportClient; } @Value("${elasticSearchPort}") private String elasticSearchPort; @Value("${elasticSearchClusterName}") private String elasticSearchClusterName; @Value("${elasticSearchPoolSize}") private String elasticSearchPoolSize; @Value("${elasticSearchIps}") public void connectionInit(String elasticSearchIps) { try { //设置netty内存管理非池化 String currentValue = System.getProperty("io.netty.allocator.type"); if (currentValue == null) { System.setProperty("io.netty.allocator.type","unpooled"); } // 配置信息 Settings esSetting = Settings.builder().put("cluster.name", elasticSearchClusterName).put("thread_pool" + ".search.size", Integer.parseInt(elasticSearchPoolSize))//增加线程池个数,暂时设为5 .build(); //配置信息Settings自定义,下面设置为EMPTY transportClient = new PreBuiltTransportClient(esSetting); String[] elasticSearchIpArray = elasticSearchIps.split(","); for (String elasticSearchIp : elasticSearchIpArray) { TransportAddress transportAddress = new TransportAddress(InetAddress.getByName(elasticSearchIp), Integer.valueOf(elasticSearchPort)); transportClient.addTransportAddresses(transportAddress); } } catch (Exception e) { logger.error("elasticsearch TransportClient create error!!!", e); } } }
抱歉抱歉~~~~~~~
import java.util.List; import java.util.Map; public class EsPage { // 指定的或是页面参数 private int currentPage; // 当前页 private int pageSize; // 每页显示多少条 // 查询es结果 private int recordCount; // 总记录数 private List<Map<String, Object>> recordList; // 本页的数据列表 // 计算 private int pageCount; // 总页数 private int beginPageIndex; // 页码列表的开始索引(包含) private int endPageIndex; // 页码列表的结束索引(包含) /** * 只接受前4个必要的属性,会自动的计算出其他3个属性的值 * * @param currentPage * @param pageSize * @param recordCount * @param recordList */ public EsPage(int currentPage, int pageSize, int recordCount, List<Map<String, Object>> recordList) { this.currentPage = currentPage; this.pageSize = pageSize; this.recordCount = recordCount; this.recordList = recordList; // 计算总页码 pageCount = (recordCount + pageSize - 1) / pageSize; // 计算 beginPageIndex 和 endPageIndex // >> 总页数不多于10页,则全部显示 if (pageCount <= 10) { beginPageIndex = 1; endPageIndex = pageCount; } // >> 总页数多于10页,则显示当前页附近的共10个页码 else { // 当前页附近的共10个页码(前4个 + 当前页 + 后5个) beginPageIndex = currentPage - 4; endPageIndex = currentPage + 5; // 当前面的页码不足4个时,则显示前10个页码 if (beginPageIndex < 1) { beginPageIndex = 1; endPageIndex = 10; } // 当后面的页码不足5个时,则显示后10个页码 if (endPageIndex > pageCount) { endPageIndex = pageCount; beginPageIndex = pageCount - 10 + 1; } } } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getRecordCount() { return recordCount; } public void setRecordCount(int recordCount) { this.recordCount = recordCount; } public List<Map<String, Object>> getRecordList() { return recordList; } public void setRecordList(List<Map<String, Object>> recordList) { this.recordList = recordList; } public int getPageCount() { return pageCount; } public void setPageCount(int pageCount) { this.pageCount = pageCount; } public int getBeginPageIndex() { return beginPageIndex; } public void setBeginPageIndex(int beginPageIndex) { this.beginPageIndex = beginPageIndex; } public int getEndPageIndex() { return endPageIndex; } public void setEndPageIndex(int endPageIndex) { this.endPageIndex = endPageIndex; } }