本文源码:GitHub·点这里 || GitEE·点这里

一、根底API简介

1、RestHighLevelClient

RestHighLevelClient的API作为ElasticSearch备受举荐的客户端组件,其封装零碎操作ES的办法,包含索引构造治理,数据增删改查治理,罕用查询方法,并且能够联合原生ES查问原生语法,性能非常弱小。

在应用RestHighLevelClient的语法时,通常波及下面几个方面,在把握根底用法之上能够依据业务特点进行一些自定义封装,这样能够更优雅的解决业务需要。

2、外围依赖

应用RestHighLevelClient须要依赖rest-high-level-client包,和ES相干根底依赖。

<dependency>    <groupId>org.elasticsearch</groupId>    <artifactId>elasticsearch</artifactId></dependency><dependency>    <groupId>org.elasticsearch.client</groupId>    <artifactId>elasticsearch-rest-client</artifactId></dependency><dependency>    <groupId>org.elasticsearch.client</groupId>    <artifactId>elasticsearch-rest-high-level-client</artifactId></dependency>

二、索引治理

这里不做过多形容,留神一点:因为ES的数据结构特点,所以不须要索引更新办法,新的字段在更新数据时间接写入即可,不须要提前更新索引构造。

@Servicepublic class EsIndexOperation {    @Resource    private RestHighLevelClient client ;    private final RequestOptions options = RequestOptions.DEFAULT;    /**     * 判断索引是否存在     */    public boolean checkIndex (String index) {        try {            return client.indices().exists(new GetIndexRequest(index), options);        } catch (IOException e) {            e.printStackTrace();        }        return Boolean.FALSE ;    }    /**     * 创立索引     */    public boolean createIndex (String indexName ,Map<String, Object> columnMap){        try {            if(!checkIndex(indexName)){                CreateIndexRequest request = new CreateIndexRequest(indexName);                if (columnMap != null && columnMap.size()>0) {                    Map<String, Object> source = new HashMap<>();                    source.put("properties", columnMap);                    request.mapping(source);                }                this.client.indices().create(request, options);                return Boolean.TRUE ;            }        } catch (IOException e) {            e.printStackTrace();        }        return Boolean.FALSE;    }    /**     * 删除索引     */    public boolean deleteIndex(String indexName) {        try {            if(checkIndex(indexName)){                DeleteIndexRequest request = new DeleteIndexRequest(indexName);                AcknowledgedResponse response = client.indices().delete(request, options);                return response.isAcknowledged();            }        } catch (Exception e) {            e.printStackTrace();        }        return Boolean.FALSE;    }}

三、数据管理

这里在更新数据时,能够间接批改索引构造,在dataMap中放进新的字段即可。

@Servicepublic class EsDataOperation {    @Resource    private RestHighLevelClient client ;    private final RequestOptions options = RequestOptions.DEFAULT;    /**     * 写入数据     */    public boolean insert (String indexName, Map<String,Object> dataMap){        try {            BulkRequest request = new BulkRequest();            request.add(new IndexRequest(indexName,"doc").id(dataMap.remove("id").toString())                    .opType("create").source(dataMap,XContentType.JSON));            this.client.bulk(request, options);            return Boolean.TRUE ;        } catch (Exception e){            e.printStackTrace();        }        return Boolean.FALSE;    }    /**     * 批量写入数据     */    public boolean batchInsert (String indexName, List<Map<String,Object>> userIndexList){        try {            BulkRequest request = new BulkRequest();            for (Map<String,Object> dataMap:userIndexList){                request.add(new IndexRequest(indexName,"doc").id(dataMap.remove("id").toString())                        .opType("create").source(dataMap,XContentType.JSON));            }            this.client.bulk(request, options);            return Boolean.TRUE ;        } catch (Exception e){            e.printStackTrace();        }        return Boolean.FALSE;    }    /**     * 更新数据,能够间接批改索引构造     */    public boolean update (String indexName, Map<String,Object> dataMap){        try {            UpdateRequest updateRequest = new UpdateRequest(indexName,"doc", dataMap.remove("id").toString());            updateRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);            updateRequest.doc(dataMap) ;            this.client.update(updateRequest, options);            return Boolean.TRUE ;        } catch (Exception e){            e.printStackTrace();        }        return Boolean.FALSE;    }    /**     * 删除数据     */    public boolean delete (String indexName, String id){        try {            DeleteRequest deleteRequest = new DeleteRequest(indexName,"doc", id);            this.client.delete(deleteRequest, options);            return Boolean.TRUE ;        } catch (Exception e){            e.printStackTrace();        }        return Boolean.FALSE;    }}

四、查问操作

留神:查问总数的CountRequest语法,SearchRequest查问后果中数据转换语法,分页查问中须要指定偏移地位和分页大小。

@Servicepublic class EsQueryOperation {    @Resource    private RestHighLevelClient client ;    private final RequestOptions options = RequestOptions.DEFAULT;    /**     * 查问总数     */    public Long count (String indexName){        // 指定创立工夫        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();        queryBuilder.must(QueryBuilders.termQuery("createTime", 1611378102795L));        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();        sourceBuilder.query(queryBuilder);        CountRequest countRequest = new CountRequest(indexName);        countRequest.source(sourceBuilder);        try {            CountResponse countResponse = client.count(countRequest, options);            return countResponse.getCount();        } catch (Exception e) {            e.printStackTrace();        }        return 0L;    }    /**     * 查问汇合     */    public List<Map<String,Object>> list (String indexName) {        // 查问条件,指定工夫并过滤指定字段值        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();        queryBuilder.must(QueryBuilders.termQuery("createTime", 1611378102795L));        queryBuilder.mustNot(QueryBuilders.termQuery("name","北京-李四"));        sourceBuilder.query(queryBuilder);        SearchRequest searchRequest = new SearchRequest(indexName);        searchRequest.source(sourceBuilder);        try {            SearchResponse searchResp = client.search(searchRequest, options);            List<Map<String,Object>> data = new ArrayList<>() ;            SearchHit[] searchHitArr = searchResp.getHits().getHits();            for (SearchHit searchHit:searchHitArr){                Map<String,Object> temp = searchHit.getSourceAsMap();                temp.put("id",searchHit.getId()) ;                data.add(temp);            }            return data;        } catch (Exception e) {            e.printStackTrace();        }        return null ;    }    /**     * 分页查问     */    public List<Map<String,Object>> page (String indexName,Integer offset,Integer size) {        // 查问条件,指定工夫并过滤指定字段值        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();        sourceBuilder.from(offset);        sourceBuilder.size(size);        sourceBuilder.sort("createTime", SortOrder.DESC);        SearchRequest searchRequest = new SearchRequest(indexName);        searchRequest.source(sourceBuilder);        try {            SearchResponse searchResp = client.search(searchRequest, options);            List<Map<String,Object>> data = new ArrayList<>() ;            SearchHit[] searchHitArr = searchResp.getHits().getHits();            for (SearchHit searchHit:searchHitArr){                Map<String,Object> temp = searchHit.getSourceAsMap();                temp.put("id",searchHit.getId()) ;                data.add(temp);            }            return data;        } catch (Exception e) {            e.printStackTrace();        }        return null ;    }}

五、排序形式

排序除了惯例的指定字段升序降序规定之外,还能够基于原生的脚本语法,基于自定义规定排序让一些特定的数据沉底或者置顶。

@Servicepublic class EsSortOperation {    @Resource    private RestHighLevelClient client ;    private final RequestOptions options = RequestOptions.DEFAULT;    /**     * 排序规定     */    public List<Map<String,Object>> sort (String indexName) {        // 先升序工夫,在倒序年龄        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();        sourceBuilder.sort("createTime", SortOrder.ASC);        sourceBuilder.sort("age",SortOrder.DESC) ;        SearchRequest searchRequest = new SearchRequest(indexName);        searchRequest.source(sourceBuilder);        try {            SearchResponse searchResp = client.search(searchRequest, options);            List<Map<String,Object>> data = new ArrayList<>() ;            SearchHit[] searchHitArr = searchResp.getHits().getHits();            for (SearchHit searchHit:searchHitArr){                Map<String,Object> temp = searchHit.getSourceAsMap();                temp.put("id",searchHit.getId()) ;                data.add(temp);            }            return data;        } catch (Exception e) {            e.printStackTrace();        }        return null ;    }    /**     * 自定义排序规定     */    public List<Map<String,Object>> defSort (String indexName) {        // 指定置换程序的规定        // [age 12-->60]\[age 19-->10]\[age 13-->30]\[age 18-->40],age其余值疏忽为1        Script script = new Script("def _ageSort = doc['age'].value == 12?60:" +                                                            "(doc['age'].value == 19?10:" +                                                            "(doc['age'].value == 13?30:" +                                                            "(doc['age'].value == 18?40:1)));" + "_ageSort;");        ScriptSortBuilder sortBuilder = SortBuilders.scriptSort(script,ScriptSortBuilder.ScriptSortType.NUMBER);        sortBuilder.order(SortOrder.ASC);        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();        sourceBuilder.sort(sortBuilder);        SearchRequest searchRequest = new SearchRequest(indexName);        searchRequest.source(sourceBuilder);        try {            SearchResponse searchResp = client.search(searchRequest, options);            List<Map<String,Object>> data = new ArrayList<>() ;            SearchHit[] searchHitArr = searchResp.getHits().getHits();            for (SearchHit searchHit:searchHitArr){                Map<String,Object> temp = searchHit.getSourceAsMap();                temp.put("id",searchHit.getId()) ;                data.add(temp);            }            return data;        } catch (Exception e) {            e.printStackTrace();        }        return null ;    }}

六、源代码地址

GitHub·地址https://github.com/cicadasmile/data-manage-parentGitEE·地址https://gitee.com/cicadasmile/data-manage-parent

举荐浏览:编程体系整顿

序号项目名称GitHub地址GitEE地址举荐指数
01Java形容设计模式,算法,数据结构GitHub·点这里GitEE·点这里☆☆☆☆☆
02Java根底、并发、面向对象、Web开发GitHub·点这里GitEE·点这里☆☆☆☆
03SpringCloud微服务根底组件案例详解GitHub·点这里GitEE·点这里☆☆☆
04SpringCloud微服务架构实战综合案例GitHub·点这里GitEE·点这里☆☆☆☆☆
05SpringBoot框架根底利用入门到进阶GitHub·点这里GitEE·点这里☆☆☆☆
06SpringBoot框架整合开发罕用中间件GitHub·点这里GitEE·点这里☆☆☆☆☆
07数据管理、分布式、架构设计根底案例GitHub·点这里GitEE·点这里☆☆☆☆☆
08大数据系列、存储、组件、计算等框架GitHub·点这里GitEE·点这里☆☆☆☆☆