import java.io.IOException; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.http.HttpHost; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.delete.DeleteRequest; import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.get.GetRequest; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Node; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.indices.CreateIndexRequest; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; @Slf4j public class EsKit { public static void main(String[] args) { //实体类 EsUser esUser = new EsUser(); int id = 1 ; esUser.setId(id); esUser.setName( "fansunion" ); EsUser esUser2 = new EsUser(); int id2 = 2 ; esUser2.setId(id2); esUser2.setName( "sugar" ); //新增 //Invalid index name [esUser], must be lowercase String indexName= "demo_esuser" ; EsKit.add(indexName, esUser); EsKit.add(indexName, esUser2); //查询 EsUser getUser=EsKit.get(indexName, id,EsUser. class ); log.info( "getUser={}" ,getUser); List<EsUser> userList=EsKit.search(indexName, "fansunion" , EsUser. class ); log.info( "userList={}" ,userList); //删除 EsKit.delete(indexName, id); //删除之后,应该为null EsUser getUserAfterDelete=EsKit.get(indexName, id,EsUser. class ); log.info( "删除之后,应该为null:{}" ,getUserAfterDelete); } //TODO 封装常用和通用的查询 public static <T> List<T> search(String indexName,String name,Class<T> clazz){ SearchRequest searchRequest = new SearchRequest(indexName); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //termQuery是相同比较 sourceBuilder.query(QueryBuilders.termQuery( "name" , name)); sourceBuilder.from( 0 ); sourceBuilder.size( 10 ); //将请求体加入到请求中 searchRequest.source(sourceBuilder); List<T> list = Lists.newArrayList(); try { SearchResponse searchResponse = getClient().search(searchRequest, RequestOptions.DEFAULT); SearchHits hits = searchResponse.getHits(); SearchHit[] searchHits = hits.getHits(); for (SearchHit hit : searchHits) { String jsonStr = hit.getSourceAsString(); log.info( "search -> " + jsonStr); list.add(JSONObject.parseObject(jsonStr,clazz)); } } catch (IOException e) { e.printStackTrace(); } return list; } public static <T> T get(String indexName, Integer id,Class<T> clazz) { T model= null ; try { GetRequest getRequest = new GetRequest(indexName, id+ "" ); RequestOptions options = RequestOptions.DEFAULT; GetResponse getResponse = getClient().get(getRequest, options); log.info( "elastic 查询成功,getResponse={}" , getResponse); String jsonStr= getResponse.getSourceAsString(); if (StringUtils.isNotEmpty(jsonStr)){ model = JSONObject.parseObject(jsonStr,clazz); } } catch (Exception e) { e.printStackTrace(); } return model; } //add已经足够了,还有必要用UpdateRequest? public static IndexResponse add(String indexName, EsUser esUser) { try { IndexRequest request = new IndexRequest(indexName); String jsonString = JSONObject.toJSONString(esUser); request.index(indexName).id(String.valueOf(esUser.getId())).source(jsonString, XContentType.JSON); IndexResponse response = getClient().index(request, RequestOptions.DEFAULT); log.info( "elastic 索引新增成功,response={}" , response); return response; } catch (Exception e) { e.printStackTrace(); log.error( "索引数据变更失败" , e); } return null ; } public static BulkResponse batchAdd(String indexName, List<EsUser> esUserList) { try { BulkRequest bulkRequest = new BulkRequest(); IndexRequest request = null ; for (EsUser esUser : esUserList) { request = new IndexRequest(indexName); request.index(indexName).id(esUser.getId() + "" ).source(XContentType.JSON,esUser); bulkRequest.add(request); } BulkResponse response = getClient().bulk(bulkRequest, RequestOptions.DEFAULT); return response; } catch (Exception e) { log.error( "批量插入索引失败" , e); } return null ; } public static DeleteResponse delete(String indexName, Integer id) { try { DeleteRequest request = new DeleteRequest(indexName); request.index(indexName).id(id + "" ); DeleteResponse response = getClient().delete(request, RequestOptions.DEFAULT); log.info( "elastic 索引删除成功,response={}" , response); return response; } catch (Exception e) { e.printStackTrace(); log.error( "索引数据变更失败" , e); } return null ; } // 索引创建------目前没用(直接添加数据) public static void createEsIndex(String indexName, String settings, String mappings) { try { CreateIndexRequest request = new CreateIndexRequest(indexName); buildSetting(request, settings); buildIndexMapping(request, mappings); getClient().indices().create(request, RequestOptions.DEFAULT); log.info( "索引创建成功" ); } catch (Exception e) { log.error( "索引创建失败:{}" , e); } } /** * 设置分片 * * @param request */ private static void buildSetting(CreateIndexRequest request, String settings) { request.settings(settings, XContentType.JSON); } /** * 设置索引的mapping * * @param request */ private static void buildIndexMapping(CreateIndexRequest request, String mappings) { request.mapping(mappings, XContentType.JSON); } private static RestHighLevelClient restHighLevelClient; public static RestHighLevelClient getClient() { if (restHighLevelClient != null ) { return restHighLevelClient; } RestClientBuilder clientBuilder = RestClient.builder( new HttpHost( "192.168.162.239" , 9200 , "http" )); // 设置监听器,每次节点失败都可以监听到,可以作额外处理 clientBuilder.setFailureListener( new RestClient.FailureListener() { public void onFailure(Node node) { super .onFailure(node); } }); restHighLevelClient = new RestHighLevelClient(clientBuilder); return restHighLevelClient; } } |