问各位一个关于es分页的问题,我使用scroll分页,每次拿20条展示在前台,然后点击下一页,在查询后面的20条数据,应该要怎么写,使用java代码写的

山南居 2019-06-03 03:25:22
我用的是RestHighLevelClient方法连接es,我查询的部分核心代码
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

// 查询条件
// 创建BoolQueryBuilder对象
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

// 匹配索引下的所有字段分词查询
QueryStringQueryBuilder queryBuilder = QueryBuilders
.queryStringQuery(inputValue.getValue());
// 配置hanlp分词器
queryBuilder.analyzer("hanlp-index");

queryBuilder.useDisMax(true);

// 子boolQueryBuilder条件条件,用来表示查询条件or的关系
BoolQueryBuilder childBoolQueryBuilder = new BoolQueryBuilder()
.should(queryBuilder);
// 添加查询条件到boolQueryBuilder中
boolQueryBuilder.must(childBoolQueryBuilder);

sourceBuilder.query(boolQueryBuilder);
// 每页多少条数据
sourceBuilder.size(10000);


// 加入高亮显示
// sourceBuilder.highlighter(highlightBuilder);

// 将请求体加入到请求中
searchRequest.source(sourceBuilder);

//设置超时时间
searchRequest.scroll(TimeValue.timeValueMinutes(1L));

// 3、发送请求
SearchResponse searchResponse;

searchResponse = esc.client.search(searchRequest);
// System.out.println(searchResponse.toString());

// 处理搜索命中文档结果
SearchHits hits = searchResponse.getHits();

// 检索命中数
long totalHits = hits.getTotalHits();


float maxScore = hits.getMaxScore();

//获取scrollID
String scrollId = searchResponse.getScrollId();
System.out.println("scrollId--->"+scrollId);


SearchHit[] searchHits = hits.getHits();

//获取数据匹配总数,
for (SearchHit hit : searchHits) {
// 取_source字段值
String sourceAsString = hit.getSourceAsString(); // 取成json串
//sourList.add(sourceAsString);
//sourList.add(scrollId);
}
我在这里已经获取了匹配数据的总数,我想每次拿20条,点击下一页是,在查询出后20条
...全文
849 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
点点成长 2021-12-23
  • 打赏
  • 举报
回复

楼主,后面怎么解决的????

「已注销」 2021-05-24
  • 打赏
  • 举报
回复

      SearchRequest searchRequest = null  ;
        if(search.getScrollId()==null){
            //第一页时scrollId为NULL,需要添加index和查询条件;除了第一页后面的就不需要添加index和条件
            searchRequest = new SearchRequest();
            Set<SearchTypeEnum> types = search.getTypes();
            //添加index
            addIndices(types,searchRequest);
            // 使用首选项参数(例如,执行搜索以首选本地分片)。默认值是跨分片随机化
            searchRequest.preference("_local");
            //trackTotalHits(true) 命中数据大于10000条时,也能返回准确的条数
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().trackTotalHits(true);
            sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
            sourceBuilder.query(boolQueryBuilder(search));
            //排序
            SortBuilder sortBuilder = SearchParse.createSortBuilder(search.getOrderBy());
            sourceBuilder.sort(sortBuilder);
            //每页大小
            sourceBuilder.size(search.getPageSize());
            searchRequest.source(sourceBuilder);
            System.out.println(sourceBuilder.toString());
        }
  SearchScrollVo searchScrollVo = new SearchScrollVo();
        // 深分页分页
        //深分页数据快照保存时间;每次请求刷新保存时间
        final Scroll scroll = new Scroll(TimeValue.timeValueMinutes(2L));
        SearchResponse response = null;
        try {
            if(search.getScrollId()==null){
                //请求第一页时进入
                searchRequest.scroll(scroll);
                response  = client.search(searchRequest, RequestOptions.DEFAULT);
            }else{
                SearchScrollRequest scrollRequest = new SearchScrollRequest(search.getScrollId());
                scrollRequest.scroll(scroll);
                response = client.scroll(scrollRequest,RequestOptions.DEFAULT);

            }
            //每次请求获取scrollId,并返回给前台,便于请求下一页
            searchScrollVo.setScrollId(response.getScrollId());
            RestStatus status = response.status();
            if(status == RestStatus.OK){
                SearchHits hits = response.getHits();
                TotalHits totalHits = hits.getTotalHits();
                long numHits = totalHits.value;
                List<.....> datas = new ArrayList<>();
                if(numHits > 0){
                    SearchHit[] searchHits = hits.getHits();
                   //把获取的数据添加到集合中
                    for (SearchHit hit : searchHits){
                      .......
                    }
                   .......
                }
                return  ......;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
Xxc6018 2021-03-29
  • 打赏
  • 举报
回复
楼主,怎么写啊,现在有答案了吗?我也碰到这个问题
对梦想的牵挂 2019-06-06
  • 打赏
  • 举报
回复
每次取20条hit吧,我的思路是循环取hitString,放到list里面,然后返回 伪代码:

            int limit=0;
            for (SearchHit hit:hits.getHits()) {
                if(limit==page){
                    break;
                 }
               String hitString = hit.getSourceAsString();
               list.add(hitString);
               // 在这里取索引1-20
               limit++;

            } 

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧