Elasticsearch Java API 封装工具类 Scroll

es版本 6.*

有两种Client 

transportClient和restClient

获取工具类方法:

public class ESClient {

    public static TransportClient getTransportClient() {
        // 解决netty冲突
        // System.setProperty("es.set.netty.runtime.available.processors", "false");
        try {
            //设置集群名称
//            Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
            Settings settings = Settings.builder().put("cluster.name", "realfake-es").build();
            //创建client
            return new PreBuiltTransportClient(settings)
                    .addTransportAddress(new TransportAddress(InetAddress.getByName(Constants.ES_HOSTS), 9300));
//                    .addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            return null;
        }
    }

    public static RestHighLevelClient getRestHighLevelClient() {
        // 解决netty冲突
        // System.setProperty("es.set.netty.runtime.available.processors", "false");
        return new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost(Constants.ES_HOSTS, 9200, "http")
                ));
    }


}

以下是工具类,省略getter和setter,属性是用来过滤和排序用的,使用Scroll检索后pageNum属性无效

public class ESRestUtil {

    private int pageSize;
    private int pageNum;
    private String sort;
    private boolean desc;
    private String brandId;
    private String seriesId;
    private String typeId;
    private String uniteId;
    private int price;
    private long dateStart;
    private long dateEnd;

    /**
     * 删除文档
     */
    public DeleteResponse deleteById(String index, String type, String documentId) {

        TransportClient client = ESClient.getTransportClient();

        if (client == null) {
            return null;
        }
        DeleteRequestBuilder delete = client.prepareDelete(index, type, documentId);
        DeleteResponse response = delete.execute().actionGet();

        client.close();
        return response;

    }

    /**
     * 查询,通过scroll方式,第一次查询返回数据和id
     * 之后查询检测到id不为空则使用scroll快照的方式返回数据,和更新位置后的id
     */
    public SearchResponse getAllByScroll(String index, String type, String scrollId) {

        TransportClient client = ESClient.getTransportClient();

        if (client == null) {
            return null;
        }
        // 设置过滤器
        // 获取bool查询
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        // 添加 filter 过滤
        if (brandId != null) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("brandId", brandId));
        }
        if (seriesId != null) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("seriesId", seriesId));
        }
        if (typeId != null) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("typeId", typeId));
        }
        if (uniteId != null) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("uniteId", uniteId));
        }
        if (price != 0) {
            // 小于等于 price
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").lte(price));
        }
        if (dateStart != 0) {
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("date").gte(dateStart));
        }
        if (dateEnd != 0) {
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("date").lte(dateEnd));
        }
        // 如果是继续浏览,则传入scrollId,获取搜索结果,和最新位置的id
        if (scrollId != null) {
            SearchScrollRequestBuilder ssrb = client.prepareSearchScroll(scrollId);
            // 重新设定id存在时间
            ssrb.setScroll("2m");
            SearchResponse response = ssrb.execute().actionGet();
            client.close();
            return response;
        } else {
            // 如果是第一次搜索,则返回搜索结果和浏览位置id
            // 获取客户端 创建搜索
            // 设置scroll过期时间,2分钟\添加过滤器
            SearchRequestBuilder srb = client.prepareSearch(index).setTypes(type).setScroll("2m").setPostFilter(boolQueryBuilder);
            // 获取match all查询
            SearchRequestBuilder searchRequestBuilder = srb.setQuery(QueryBuilders.matchAllQuery());
            // 配置每次返回数据量
            if (pageSize == 0) {
                searchRequestBuilder.setSize(10);
            }
            // 排序方式使用date降序

            searchRequestBuilder.addSort("date", SortOrder.DESC);

            // 执行搜索,
            // 返回搜索response,包含数据、搜索结果数、scrollId等
            SearchResponse response = searchRequestBuilder.execute().actionGet();
            client.close();
            return response;
        }
    }

    public SearchResponse searchMutilByScroll(String index, String type, String keyWord, String scrollId) {

        TransportClient client = ESClient.getTransportClient();

        if (client == null) {
            return null;
        }
        // 设置过滤器
        // 获取bool查询
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        // 添加 filter 过滤
        if (brandId != null) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("brandId", brandId));
        }
        if (seriesId != null) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("seriesId", seriesId));
        }
        if (typeId != null) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("typeId", typeId));
        }
        if (uniteId != null) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("uniteId", uniteId));
        }
        if (price != 0) {
            // 小于等于 price
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").lte(price));
        }
        if (dateStart != 0) {
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("date").gte(dateStart));
        }
        if (dateEnd != 0) {
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("date").lte(dateEnd));
        }
        // 如果是继续浏览,则传入scrollId,获取搜索结果,和最新位置的id
        if (scrollId != null) {
            SearchScrollRequestBuilder ssrb = client.prepareSearchScroll(scrollId);
            // 重新设定id存在时间
            ssrb.setScroll("2m");
            SearchResponse response = ssrb.execute().actionGet();
            client.close();
            return response;
        } else {
            // 如果是第一次搜索,则返回搜索结果和浏览位置id
            // 获取客户端 创建搜索
            // 设置scroll过期时间,2分钟\添加过滤器
            SearchRequestBuilder srb = client.prepareSearch(index).setTypes(type).setScroll("2m").setPostFilter(boolQueryBuilder);
            // 添加搜索关键字条件,目前匹配 标题和描述任一包含就行,使用should
            QueryBuilder titleQueryBuilder = QueryBuilders.matchPhraseQuery("title", keyWord);
            QueryBuilder describeQueryBuilder = QueryBuilders.matchPhraseQuery("describe", keyWord);

            SearchRequestBuilder searchRequestBuilder = srb.setQuery(
                    boolQueryBuilder
                            .must(describeQueryBuilder)
                            .should(titleQueryBuilder)
            );
            // 配置每次返回数据量
            if (pageSize == 0) {
                searchRequestBuilder.setSize(10);
            }
            // 排序方式,未指定则用score相关度排序
            if (sort != null) {
                searchRequestBuilder.addSort(sort, desc ? SortOrder.DESC : SortOrder.ASC);
            } else {
                searchRequestBuilder.setExplain(true);
            }

            // 执行搜索,
            // 返回搜索response,包含数据、搜索结果数、scrollId等
            SearchResponse response = searchRequestBuilder.execute().actionGet();
            client.close();
            return response;
        }
    }

    /**
     * 查询
     *
     * @throws Exception
     */
    public SearchResponse searchMutil(String index, String type, String keyWord) {

        TransportClient client = ESClient.getTransportClient();

        if (client == null) {
            return null;
        }
        // 获取客户端 创建搜索
        SearchRequestBuilder srb = client.prepareSearch(index).setTypes(type);
        // 获取bool查询
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        // 添加 filter 过滤
        if (brandId != null) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("brandId", brandId));
        }
        if (seriesId != null) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("seriesId", seriesId));
        }
        if (typeId != null) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("typeId", typeId));
        }
        if (uniteId != null) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("uniteId", uniteId));
        }
        if (price != 0) {
            // 小于等于 price
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").lte(price));
        }
        if (dateStart != 0) {
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("date").gte(dateStart));
        }
        if (dateEnd != 0) {
            boolQueryBuilder.filter(QueryBuilders.rangeQuery("date").lte(dateEnd));
        }
        // 添加搜索关键字条件,目前匹配 标题和描述任一包含就行,使用should
        QueryBuilder titleQueryBuilder = QueryBuilders.matchPhraseQuery("title", keyWord);
        QueryBuilder describeQueryBuilder = QueryBuilders.matchPhraseQuery("describe", keyWord);

        SearchRequestBuilder searchRequestBuilder = srb.setQuery(
                boolQueryBuilder
                        .must(describeQueryBuilder)
                        .should(titleQueryBuilder)
        );
        // 配置分页
        searchRequestBuilder.setFrom(pageNum);
        if (pageSize != 0) {
            searchRequestBuilder.setSize(pageSize);
        }
        // 排序方式,未指定则用score相关度排序
        if (sort != null) {
            searchRequestBuilder.addSort(sort, desc ? SortOrder.DESC : SortOrder.ASC);
        } else {
            searchRequestBuilder.setExplain(true);
        }
        // 执行搜索,
        // 返回搜索response,包含数据、搜索结果数等
        SearchResponse response = searchRequestBuilder.execute().actionGet();
        client.close();
        return response;

    }


    /**
     * 验证索引是否存在
     *
     * @param index 索引名称
     * @return
     * @throws Exception
     */
    public boolean indexExists(String index) throws Exception {

        RestHighLevelClient client = ESClient.getRestHighLevelClient();
        GetIndexRequest request = new GetIndexRequest();
        request.indices(index);
        request.local(false);
        request.humanReadable(true);

        boolean exists = client.indices().exists(request);
        client.close();
        return exists;
    }

    /**
     * 创建索引
     *
     * @param index
     * @param indexType
     * @param properties 结构: {name:{type:text}} {age:{type:integer}}
     * @return
     * @throws Exception
     */
    public boolean indexCreate(String index, String indexType,
                               Map<String, Object> properties) throws Exception {

        RestHighLevelClient client = ESClient.getRestHighLevelClient();
        if (indexExists(index)) {
            client.close();
            return true;
        }
        CreateIndexRequest request = new CreateIndexRequest(index);
        request.settings(Settings.builder().put("index.number_of_shards", 3)
                .put("index.number_of_replicas", 2));

        Map<String, Object> jsonMap = new HashMap<>();
        Map<String, Object> mapping = new HashMap<>();
        mapping.put("properties", properties);
        jsonMap.put(indexType, mapping);
        request.mapping(indexType, jsonMap);

        CreateIndexResponse createIndexResponse = client.indices().create(
                request);
        boolean acknowledged = createIndexResponse.isAcknowledged();
        client.close();
        return acknowledged;
    }

    /**
     * 删除索引
     *
     * @param index
     * @return
     * @throws Exception
     */
    public boolean indexDelete(String index) throws Exception {

        RestHighLevelClient client = ESClient.getRestHighLevelClient();
        try {
            DeleteIndexRequest request = new DeleteIndexRequest(index);
            DeleteIndexResponse deleteIndexResponse = client.indices().delete(
                    request);
            return deleteIndexResponse.isAcknowledged();
        } catch (ElasticsearchException exception) {
            if (exception.status() == RestStatus.NOT_FOUND) {
                return true;
            } else {
                return false;
            }
        } finally {

            client.close();
        }
    }

    /**
     * 根据文档ID,传入json结构,创建或更新文档,
     *
     * @param index
     * @param indexType
     * @param documentId
     * @param jsonStr
     * @return
     * @throws Exception
     */
    public boolean documentCreate(String index, String indexType,
                                  String documentId, String jsonStr) throws Exception {

        RestHighLevelClient client = ESClient.getRestHighLevelClient();
        IndexRequest request = new IndexRequest(index, indexType, documentId);

        request.source(jsonStr, XContentType.JSON);
        IndexResponse indexResponse = client.index(request);

        if (indexResponse.getResult() == DocWriteResponse.Result.CREATED
                || indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {
            client.close();
            return true;
        }
        ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();
        if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
            client.close();
            return true;
        }
        if (shardInfo.getFailed() > 0) {
            for (ReplicationResponse.ShardInfo.Failure failure : shardInfo
                    .getFailures()) {
                client.close();
                throw new Exception(failure.reason());
            }
        }
        client.close();
        return false;
    }

    /**
     * 传入Map,ID,创建或更新文档
     *
     * @param index
     * @param indexType
     * @param documentId
     * @param map
     * @return
     * @throws Exception
     */
    public boolean documentCreate(String index, String indexType,
                                  String documentId, Map<String, Object> map) throws Exception {

        RestHighLevelClient client = ESClient.getRestHighLevelClient();
        IndexRequest request = new IndexRequest(index, indexType, documentId);

        request.source(map);
        IndexResponse indexResponse = client.index(request);

        if (indexResponse.getResult() == DocWriteResponse.Result.CREATED
                || indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {
            client.close();
            return true;
        }
        ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();
        if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
            client.close();
            return true;
        }
        if (shardInfo.getFailed() > 0) {
            for (ReplicationResponse.ShardInfo.Failure failure : shardInfo
                    .getFailures()) {
                client.close();
                throw new Exception(failure.reason());
            }
        }
        client.close();
        return false;
    }

    /**
     * 传入json结构数据,创建文档,返回ID
     *
     * @param index
     * @param indexType
     * @param jsonStr
     * @return
     * @throws Exception
     */
    public String documentCreate(String index, String indexType, String jsonStr)
            throws Exception {

        RestHighLevelClient client = ESClient.getRestHighLevelClient();
        IndexRequest request = new IndexRequest(index, indexType);

        request.source(jsonStr, XContentType.JSON);
        IndexResponse indexResponse = client.index(request);

        String id = indexResponse.getId();
        if (indexResponse.getResult() == DocWriteResponse.Result.CREATED
                || indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {
            client.close();
            return id;
        }
        ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();
        if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
            client.close();
            return id;
        }
        if (shardInfo.getFailed() > 0) {
            for (ReplicationResponse.ShardInfo.Failure failure : shardInfo
                    .getFailures()) {
                client.close();
                throw new Exception(failure.reason());
            }
        }
        client.close();
        return null;
    }

    /**
     * 传入Map,创建文档,返回ID
     *
     * @param index
     * @param indexType
     * @param map
     * @return
     * @throws Exception
     */
    public String documentCreate(String index, String indexType,
                                 Map<String, Object> map) throws Exception {

        RestHighLevelClient client = ESClient.getRestHighLevelClient();
        IndexRequest request = new IndexRequest(index, indexType);

        request.source(map);
        IndexResponse indexResponse = client.index(request);

        String id = indexResponse.getId();
        if (indexResponse.getResult() == DocWriteResponse.Result.CREATED
                || indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {
            client.close();
            return id;
        }
        ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();
        if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
            client.close();
            return id;
        }
        if (shardInfo.getFailed() > 0) {
            for (ReplicationResponse.ShardInfo.Failure failure : shardInfo
                    .getFailures()) {
                client.close();
                throw new Exception(failure.reason());
            }
        }
        client.close();
        return null;
    }

    public boolean documentDelete(String index, String indexType,
                                  String documentId) throws Exception {

        RestHighLevelClient client = ESClient.getRestHighLevelClient();
        DeleteRequest request = new DeleteRequest(index, indexType, documentId);
        DeleteResponse deleteResponse = client.delete(request);
        if (deleteResponse.getResult() == DocWriteResponse.Result.NOT_FOUND) {
            client.close();
            return true;
        }
        ReplicationResponse.ShardInfo shardInfo = deleteResponse.getShardInfo();
        if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
            client.close();
            return true;
        }
        if (shardInfo.getFailed() > 0) {
            for (ReplicationResponse.ShardInfo.Failure failure : shardInfo
                    .getFailures()) {
                client.close();
                throw new Exception(failure.reason());
            }
        }
        client.close();
        return false;
    }

    /**
     * 将查询后获得的response转成list
     *
     * @param response
     * @return
     */
    public static List responseToList(SearchResponse response) {
        SearchHits hits = response.getHits();
        List<Map<String, Object>> list = new ArrayList<>();
        for (int i = 0; i < hits.getHits().length; i++) {
            Map<String, Object> map = hits.getAt(i).getSourceAsMap();
            list.add(map);
        }
        return list;
    }

    @Override
    public String toString() {
        return "ESRestUtil{" +
                "pageSize=" + pageSize +
                ", pageNum=" + pageNum +
                ", sort='" + sort + '\'' +
                ", desc=" + desc +
                ", brandId='" + brandId + '\'' +
                ", seriesId='" + seriesId + '\'' +
                ", typeId='" + typeId + '\'' +
                ", uniteId='" + uniteId + '\'' +
                ", price=" + price +
                '}';
    }
}

个人测试时的方法,无逻辑只看使用方式:

package com.realfake.model.utils.elasticsearch;

import org.elasticsearch.action.search.SearchResponse;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {
    public static void main(String[] args) throws Exception {

        ESRestUtil util = new ESRestUtil();
        System.out.println(util.deleteById("commodity", "commodity", "1"));

        System.out.println(util.indexExists("commodity"));
        System.out.println(util.indexExists("indextest005"));

        Map<String, Object> map = new HashMap<>();
        map.put("name", new HashMap() {
            {
                put("type", "text");
            }
        });
        map.put("age", new HashMap() {
            {
                put("type", "double");
            }
        });
        map.put("sex", new HashMap() {
            {
                put("type", "double");
            }
        });
        map.put("address", new HashMap() {
            {
                put("type", "text");
            }
        });

        // 创建主题
        util.indexCreate("indextest005", "sx", map);

        //创建文档1
        System.out.println(util.documentCreate("indextest005", "sx",
                new HashMap<String,Object>() {
                    {
                        put("name", "名称1");
                        put("age", 18);
                        put("sex", 10);
                        put("address", "地址1");
                    }
                }));

        // 创建更新文档2
        System.out.println(util.documentCreate("commodity", "commodity", "1",
                new HashMap<String,Object>() {
                    {
                        put("typeId", new String[]{"1","2"});
                        put("price", new int[]{1,2});
                        put("age", 18);
                        put("sex", 10);
                        put("address", "123");
                    }
                }));

        //删除文档
        System.out.println(util.documentDelete("indextest005", "sx", "EvyzG2oBWpJzBJGJTpdY"));

        // 多条件
        util.setSort("price");
        System.out.println(ESRestUtil.responseToList(util.searchMutil("commodity", "commodity","阿迪")));

        // scroll检索
        SearchResponse response = util.searchMutilByScroll("commodity", "commodity","商品",null);
        while(true){
            System.out.println(ESRestUtil.responseToList(response));
            System.out.println(response.getScrollId());
            response = util.searchMutilByScroll("commodity", "commodity","商品",response.getScrollId());
        }

        

    }
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值