ElasticSearch7基础分页以及Scroll分页

ElasticSearch7基础分页以及Scroll分页

Maven依赖

<elasticsearch.version>7.2.0elasticsearch.version>
<dependency>
            <groupId>org.elasticsearch.clientgroupId>
            <artifactId>elasticsearch-rest-high-level-clientartifactId>
            <version>${elasticsearch.version}version>
 dependency>  
<dependency>
        <groupId>org.elasticsearchgroupId>
        <artifactId>elasticsearchartifactId>
        <version>${elasticsearch.version}version>
    dependency>

常用分页

 @Test
public void esPageFromSize() throws IOException {
    int from = 0;
    int pageSize = 40;
    String beginData = "2016-01-01 00:00:00";
    String endData = "2018-12-05 00:00:00";
    String respCode = "200";
    String name = "应用A";
    PageData pageData = new PageData();

    //获取分页对象

    //接受结果
    List<Map> data = new ArrayList<>();
    //获取es客户端
    //获取索引名称
    RestHighLevelClient client = EsClientMe.getRhlClient();
    //创建请求对象,如果不传参数,这将针对所有索引运行,这里搜索多个索引
    SearchRequest searchRequest = new SearchRequest(index);

    //创建封装查询条件参数的对象SearchSourceBuilder,所有的查询条件都会封装到此类
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    //查询条件
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().minimumShouldMatch(0);
    boolQuery.must(QueryBuilders.rangeQuery(CommonMapping.REQUESTTIME).timeZone(DateTimeZone.getDefault().getID()).format(CommonMapping.CLINT_TIMESS).
            gt(beginData).lte(endData));

    boolQuery.must(QueryBuilders.termQuery(CommonMapping.RESPCODE, respCode));

    boolQuery.should(QueryBuilders.termQuery(CommonMapping.APPNAME, name));
    boolQuery.should(QueryBuilders.termQuery(CommonMapping.SERVICENAME, name));
    //页面及排序
    searchSourceBuilder.query(boolQuery).from(from).size(pageSize).sort("tookTime", SortOrder.DESC);

    searchRequest.source(searchSourceBuilder);
    SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);

    long totalCount = response.getHits().getTotalHits().value;
    pageData.setTotal(totalCount);

    //数据总页数
    SearchHits hits = response.getHits();

    for (SearchHit hit : hits.getHits()) {
        //调用通讯对 对应的结果集方法
        Map<String, Object> map = hit.getSourceAsMap();
        data.add(map);
    }
    //       pageData.setItems(data);
        System.out.println(pageData.getTotal());
    }

快照分页


    @Test
    public void esPageScroll() {
        String type = "1";
//        String page = 1;
        String from = "0";
        int pageSize = 40;


        String beginData = "2018-01-01 00:00:00";
        String endData = "2018-12-05 00:00:00";
        String respCode = "200";
        String name = "应用B";

        EsQueryPageVo vo = new EsQueryPageVo();
        vo.setIndex(1);
        vo.setPageSize(20);


        System.out.println(">>>>>>>" + vo.toString());
        PageData pageData = new PageData();

        //获取分页对象

        //接受结果
        List data = new ArrayList<>();
        //获取es客户端
        //获取索引名称
        //创建请求对象,如果不传参数,这将针对所有索引运行,这里搜索多个索引
        SearchRequest searchRequest = new SearchRequest(index);
        //初始化scroll,设置滚动时间间隔,默认值60s
        Scroll scroll = getCommonScroll(1);
        searchRequest.scroll(scroll);

        //创建封装查询条件参数的对象SearchSourceBuilder,所有的查询条件都会封装到此类
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        //.minimumShouldMatch(1) ;  默认值为0 设置参数为最小匹配should的数量
        boolQuery.must(QueryBuilders.rangeQuery(CommonMapping.REQUESTTIME).timeZone(DateTimeZone.getDefault().getID()).format(CommonMapping.CLINT_TIMESS).
                gt(vo.getBeginData()).lte(vo.getEndData()));

        //响应码匹配
        List codelist = Arrays.asList("200");
        vo.setRespCode(codelist);
        boolQuery.filter(QueryBuilders.termsQuery(CommonMapping.RESPCODE, vo.getRespCode().toArray(new String[0])));

        boolQuery.must(QueryBuilders.termQuery(CommonMapping.RESPCODE, 200));

        searchSourceBuilder.query(boolQuery).size(vo.getPageSize()).sort(CommonMapping.REQUESTTIME, SortOrder.DESC);

        //设置搜索方式并传入SearchSourceBuilder
        searchRequest = setQueryTypeAndBuilder(searchRequest, searchSourceBuilder);

        try {
            //同步执行,去查询数据获取结果
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

            //获取总数量
            long totalCount = searchResponse.getHits().getTotalHits().value;
            pageData.setTotal(totalCount);
            //计算总页数,每次搜索数量为分片数*设置的size大小
            int page = (int) Math.ceil((float) totalCount / pageSize);
            for (int i = 1; i <= page; i++) {
                //匹配分页
                if (page == i) {
                    //获取结果
                    SearchHit[] hits = searchResponse.getHits().getHits();
                    for (SearchHit hit : hits) {
                        Map map = hit.getSourceAsMap();
                        map.put("_id", hit.getId());
                        data.add(map);
                    }
                    //如果匹配到设置的分页,则此次循环退出
                    break;
                }
                searchResponse = setScrollRequest(searchResponse, client, scroll);
            }

            //清除快照
            clearScrollRequest(searchResponse, client);
        } catch (IOException e) {
            e.printStackTrace();
        }
//            return pageData;
        System.out.println(pageData.getTotal());
    }

客户端示例

public class EsClientMe {

    /**
     * es配置信息
     */
    private static String clusterName = "";//客户端名称
    private static String nodes = "";//节点地址
    private static int port = 9200;


    /**
     * 链接超时时长
     */

    private static final int CONNECT_TIME_OUT = 1000;
    /**
     * socket超时时间
     */
    private static final int SOCKET_TIME_OUT = 30000;
    /**
     * 链接请求超时时间
     */
    private static final int CONNECTION_REQUEST_TIME_OUT = 500;

    private static final int MAX_CONNECT_NUM = 100;
    private static final int MAX_CONNECT_PER_ROUTE = 100;


    private static boolean uniqueConnectTimeConfig = false;
    private static boolean uniqueConnectNumConfig = true;
    private static RestClientBuilder builder;
    private static volatile RestClient restClient;
    private static RestHighLevelClient restHighLevelClient;

    public static void getClient() {
        builder = RestClient.builder(new HttpHost(nodes, port, "http"));
        if (uniqueConnectTimeConfig) {
            setConnectTimeOutConfig();
        }
        if (uniqueConnectNumConfig) {
            setMutiConnectConfig();
        }
        restClient = builder.build();
        restHighLevelClient = new RestHighLevelClient(builder);
    }
    public static RestClient getSingleClient() {
        if (restClient == null) {
            synchronized (RestClient.class) {
                if (restClient == null) {
                    getClient();
                }
            }
        }
        return restClient;
    }

    public static RestHighLevelClient getRhlClient() {
        if (restHighLevelClient == null) {
            synchronized (RestHighLevelClient.class) {
                if (restHighLevelClient == null) {
                    getClient();
                }
            }
        }
        return restHighLevelClient;
    }

    /**
     * 主要关于异步httpclient的连接延时配置
     */
    public static void setConnectTimeOutConfig() {
        builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
            @Override
            public Builder customizeRequestConfig(Builder requestConfigBuilder) {
                requestConfigBuilder.setConnectTimeout(CONNECT_TIME_OUT);
                requestConfigBuilder.setSocketTimeout(SOCKET_TIME_OUT);
                requestConfigBuilder.setConnectionRequestTimeout(CONNECTION_REQUEST_TIME_OUT);
                return requestConfigBuilder;
            }
        });
    }

    /**
     * 主要关于异步httpclient的连接数配置
     */
    public static void setMutiConnectConfig() {
        builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {

            @Override
            public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                httpClientBuilder.setMaxConnTotal(MAX_CONNECT_NUM);
                httpClientBuilder.setMaxConnPerRoute(MAX_CONNECT_PER_ROUTE);
                return httpClientBuilder;
            }
        });
    }




}

你可能感兴趣的:(大数据)