es分页方式search_after

三种分页方式

1,from size

2,scroll分页

3,使用 search_after 进行分页

可参考:https://blog.csdn.net/zzh920625/article/details/84593590

对比

使用search_after 进行分页 相比from&size的方式要更加高效,而且在不断有新数据入库的时候仅仅使用from和size分页会有重复的情况
相比使用scroll分页,search_after可以进行实时的查询
不过search_after不适合跳跃式的分页

注意事项

1,类似mysql limit offset size,进行分页查询时,取上一页最后一条数据的id;

2,如果是多个字段排序的话,search_after值的顺序要与我们排序条件的顺序一致,此处ID倒序

3,使用search_after时 from设置为0,-1或者直接不加from

请求参数

{
    "purchaseOrgCodes":[
        "P001"
    ],
    "page":3,
    "size":200,
    "scrollId":"W0M3_534206"
}

代码如下

 private SearchRequest buildSearchRequest(EsSchemel esSchemel, QueryBuilder params, int pageSize, String orderBy, String scrollId) {
        if (pageSize > 10000) {
            //fixed:es error,from + size must be less than or equal to: [10000]
            pageSize = 10000;
        }
        SearchRequest searchRequest = new SearchRequest(esSchemel.getIndex());
        searchRequest.types(esSchemel.getType());
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(params);
        //sourceBuilder.from(pageNo - 1);
        sourceBuilder.size(pageSize);
        sourceBuilder.timeout(new TimeValue(30, TimeUnit.SECONDS));
        if (esSchemel.getSelectCols() != null && esSchemel.getSelectCols().length > 0) {
            //性能参数,减少io
            sourceBuilder.fetchSource(esSchemel.getSelectCols(), EXCLUDEFIELDS);
        }
        if (!Strings.isNullOrEmpty(orderBy)) {
            sourceBuilder.sort(new FieldSortBuilder(orderBy).order(SortOrder.DESC));
            if (!Strings.isNullOrEmpty(scrollId)) {
                sourceBuilder.searchAfter(new Object[]{scrollId});
            }
        }
        searchRequest.source(sourceBuilder);
        return searchRequest;
    }

 

使用elasticsearch的Java客户端restHighLevelClient实现search_after + PIT分页,可以按照以下步骤进行操作: 1. 创建SearchRequest对象,设置index、type、source等属性。 2. 使用SearchSourceBuilder设置查询条件,包括查询关键字、过滤条件、排序规则等。 3. 创建SearchCursor对象,使用SearchCursor.scroll方法进行第一次查询,并获取SearchAfterBuilder对象。 4. 使用SearchAfterBuilder设置search_after参数,并使用SearchCursor.scroll方法进行下一页查询。 5. 重复步骤4直到查询到最后一页数据。 下面是具体代码实现: ```java // 创建SearchRequest对象 SearchRequest searchRequest = new SearchRequest(index); searchRequest.types(type); // 创建SearchSourceBuilder对象 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchQuery("field", "value")); sourceBuilder.sort(SortBuilders.fieldSort("date").order(SortOrder.DESC)); sourceBuilder.from(0).size(10); // 设置每页显示10条数据 // 创建SearchCursor对象 SearchCursor cursor = new SearchCursor(searchRequest, sourceBuilder, client); // 第一次查询并获取SearchAfterBuilder对象 SearchAfterBuilder searchAfterBuilder = cursor.scroll(); // 循环查询下一页数据 while (searchAfterBuilder != null) { // 设置search_after参数 sourceBuilder.searchAfter(searchAfterBuilder.getSearchAfter()); // 查询下一页数据 SearchResponse response = client.search(searchRequest.source(sourceBuilder)); // 处理查询结果 processResponse(response); // 获取下一页SearchAfterBuilder对象,如果返回null则表示查询到最后一页数据 searchAfterBuilder = cursor.scroll(response); } ``` 使用PIT分页可以避免查询过程中数据的变化对查询结果的影响,具体实现方法可以参考elasticsearch官方文档。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值