elasticsearch持有者类
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.StringUtils; import org.elasticsearch.action.bulk.BulkItemResponse; import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.delete.DeleteRequest; import org.elasticsearch.action.delete.DeleteRequestBuilder; import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.client.Client; import org.elasticsearch.client.Requests; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.sort.SortOrder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.Closeable; import java.io.IOException; import java.io.Serializable; import java.net.InetAddress; import java.util.Arrays; import java.util.List; import java.util.Map; /** * <p></p> * * @author * @version V1.0 * @modificationHistory=========================逻辑或功能性重大变更记录 * @modify by user: $author$ $date$ * @modify by reason: {方法名}:{原因} */ public class ESHolder implements Serializable,Closeable{ private static final Logger LOG = LoggerFactory.getLogger(ESHolder.class); private String esClusterName = null; private String esClusterAddress = null; // ES客户端 private Client ESClient = null; public ESHolder(String esClusterName, String esClusterAddress) { this.esClusterName = esClusterName; this.esClusterAddress = esClusterAddress; } public Client getESClient() { if (ESClient == null) { initESClient(esClusterName, esClusterAddress); } return ESClient; } /** * 批量建立ES索引 * * @param list * @return * @author */ public boolean addIndex(String indexName, String typeName, List<Map<String, Object>> list) { long t = System.currentTimeMillis(); try { ObjectMapper mapper = new ObjectMapper(); BulkRequestBuilder bulkRequest = getESClient().prepareBulk(); for(Map<String, Object> data : list){ byte[] json = mapper.writeValueAsBytes(data); bulkRequest.add(new IndexRequest(indexName, typeName).source(json)); } BulkResponse response = bulkRequest.execute().actionGet(); if(response.hasFailures()){ BulkItemResponse[] itemResponses = response.getItems(); for(BulkItemResponse itemResponse : itemResponses){ // TODO Must do something to handle failures. LOG.error("Add ES Index failed! DOC_ID: {}, Reason: {}", itemResponse.getId(), itemResponse.getFailureMessage()); } } } catch (JsonProcessingException e) { LOG.error("Build index fail.", e); return false; } LOG.debug("build index complete,num:{}, cost:{}", list.size(), System.currentTimeMillis() - t); return true; } /** * 批量删除ES索引 * * @param docIds * * */ public void deleteIndex(String indexName, String typeName, List<String> docIds){ BulkRequestBuilder bulkRequest = getESClient().prepareBulk(); for(String docId : docIds){ bulkRequest.add(new DeleteRequest(indexName, typeName, docId)); } BulkResponse response = bulkRequest.execute().actionGet(); if(response.hasFailures()){ BulkItemResponse[] itemResponses = response.getItems(); for(BulkItemResponse itemResponse : itemResponses){ // TODO Must do something to handle failures. LOG.error("ES Index delete failed! DOC_ID: {}, Reason: {}", itemResponse.getId(), itemResponse.getFailureMessage()); } } } /** * 删除ES索引 * * @param indexName * @param typeName * @param data * @return */ public boolean deleteIndex(String indexName, String typeName, Map<String, Object> data){ DeleteRequestBuilder requestBuilder = getESClient().prepareDelete(indexName, typeName, (String) data.get(“rowkey”)); DeleteResponse response = requestBuilder.execute().actionGet(); if(!response.isFound()){ LOG.error("ES Index not found! DOC_ID: {}", response.getId()); return false; } return true; } /** * 从ES查询数据 * * @param query * @return * */ public SearchHits queryWithES(SearchRequestBuilder query){ SearchHits response = query.execute().actionGet().getHits(); return response; } /** * 构造查询对象 * * @param index * @param type * @param queryBuilder * @param retField * @param sortField * @param start * @param rows * @return */ public SearchRequestBuilder buildSearch(String index, String type, QueryBuilder queryBuilder, String retField, String sortField, SortOrder sortOrder, int start, int rows){ SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(queryBuilder).from(start).size(rows); if(StringUtils.isNotEmpty(retField)){ searchSourceBuilder.field(retField); } if(StringUtils.isNotEmpty(sortField)){ searchSourceBuilder.sort(sortField, sortOrder); } LOG.debug("ES Query string: " + searchSourceBuilder.toString()); return getESClient().prepareSearch().setIndices(index).setTypes(type) .setExtraSource(searchSourceBuilder.buildAsBytes(Requests.CONTENT_TYPE)); } /** * 统计数据量 * * @return 符合条件的数据量 */ public long countWithQuery(String indexName, String typeName, QueryBuilder queryBuilder){ SearchRequestBuilder builder = getESClient().prepareSearch(indexName).setTypes(typeName) .setQuery(queryBuilder).setFrom(0).setSize(0); return countWithQuery(builder); } /** * 统计数据量 * * @param query * @return * */ public long countWithQuery(SearchRequestBuilder query){ return query.execute().actionGet().getHits().getTotalHits(); } /** * 初始化ES客户端 * * @return */ private void initESClient(String esClusterName, String esClusterAddress) { int esClientTimeout = 180000; LOG.info("init ES Client..."); try { String[] hostPair = esClusterAddress.split(“,”); TransportAddress[] addrs = new TransportAddress[hostPair.length]; int i = 0; String[] keyValuePair; for (String t : hostPair) { keyValuePair = t.split(":"); if (2 != keyValuePair.length) { throw new IOException("ES's host is not correct:" + Arrays.toString(keyValuePair)); } addrs[i] = new InetSocketTransportAddress(InetAddress.getByName(keyValuePair[0]), Integer.valueOf(keyValuePair[1])); i++; } Settings settings = Settings.settingsBuilder() .put("cluster.name", esClusterName) .put("client.transport.sniff", true) .put("client.transport.ping_timeout", esClientTimeout + "s").build(); ESClient = TransportClient.builder().settings(settings).build().addTransportAddresses(addrs); } catch (Exception e) { LOG.error("Address error!", e); } } @Override public void close() throws IOException { if(this.ESClient != null){ LOG.info("closing esclient...."); this.ESClient.close(); this.ESClient = null; } } }