es 5.x 版本使用srcoll scan解决数据太大,分页报错的问题

 @Override
    public Page<RealTimeMonitorDomain> querySimlarInfoList(int pageSize, int page, String groupId,String id) {
        //1.初始化条件
        NativeSearchQueryBuilder nsb = new NativeSearchQueryBuilder();//总的查询条件
        BoolQueryBuilder bools = QueryBuilders.boolQuery();
        //2.设置查询
        bools.must(QueryBuilders.termQuery("groupId",groupId));
        bools.mustNot(QueryBuilders.termQuery("id",id));
        nsb.withQuery(bools);
        //3.设置排序
        nsb.withSort(new FieldSortBuilder("pubDate").order(SortOrder.DESC));
        //4.设置分页
        nsb.withPageable(new PageRequest(page-1, pageSize));//pagenum是从0开始,坑爹啊!
        //5.查询的建立
        SearchQuery searchQuery = nsb.build();//查询建立
        logger.info("相似度列表查询sql:"+searchQuery.getQuery().toString());
       // Page<RealTimeMonitorDomain> pageable = elasticsearchTemplate.queryForPage(searchQuery,RealTimeMonitorDomain.class);
        Paging paging=new Paging();
        List<RealTimeMonitorDomain> rtmdList=new ArrayList<RealTimeMonitorDomain>();
        String scrollId = elasticsearchTemplate.scan(searchQuery,1000,false);
        boolean hasRecords = true;
        while (hasRecords) {
            Page<RealTimeMonitorDomain> singlePage = elasticsearchTemplate.scroll(scrollId, 5000L, new SearchResultMapper() {
                @Override
                public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
                    List<RealTimeMonitorDomain> chunk = new ArrayList<RealTimeMonitorDomain>();
                    for (SearchHit searchHit : response.getHits()) {
                        if (response.getHits().getHits().length <= 0) {
                            return null;
                        }
                        RealTimeMonitorDomain user = new RealTimeMonitorDomain();
                        user.setId(searchHit.getId());
                        user.setTitle(searchHit.getSource().get("message").toString());
                        chunk.add(user);
                    }
                    if (chunk.size() > 0) {
                        return new AggregatedPageImpl<T>((List<T>) chunk);
                    }
                    return null;
                }
            });
            if (singlePage!= null) {
                rtmdList.addAll(singlePage.getContent());
            } else {
                hasRecords = false;
            }
            paging.setTotalCount(singlePage.getTotalElements());
            paging.setTotalPage(singlePage.getTotalPages());
        }
        elasticsearchTemplate.clearScroll(scrollId);
        paging.setPage(page);
        paging.setPageSize(pageSize);
        paging.setResult(rtmdList);
        return pageable;
    }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值