diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java index 21da45258..e1d23c882 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java @@ -825,13 +825,13 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { long total = totalResponse.count(); // 分页查询 - int pageNum = PageUtil.totalPage(total, 2000); + int pageNum = PageUtil.totalPage(total, 500); - FieldValue searchAfterSortId = FieldValue.of(1); + List searchAfterSortValues = null; for (int page = 1; page <= pageNum; page++) { SearchRequest.Builder searchBuilder = new SearchRequest.Builder() .index(ORDER_PLATE_MODEL.getIndex()) - .size(2000) + .size(500) .sort(s -> s.field(f -> f.field("id.keyword").order(SortOrder.Asc))) .query(q -> q.bool(b -> b .filter(f -> f.terms(t -> t.field("orderId").terms(e -> e.value(orderIds.stream().map(FieldValue::of).toList())))) @@ -843,7 +843,10 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { ) .trackTotalHits(t -> t.enabled(false)); - searchBuilder.searchAfter(searchAfterSortId); + // 设置 search_after,非第一页时才需要 + if (searchAfterSortValues != null) { + searchBuilder.searchAfter(searchAfterSortValues); + } SearchResponse response = elasticsearchClient.search(searchBuilder.build(), OrderModelDO.class); @@ -853,17 +856,16 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { results.add(hit.source()); } - // 取最后一个命中文档的 id 作为下一页的 search_after 值 - if (!hits.isEmpty()) { - OrderModelDO lastDoc = hits.get(hits.size() - 1).source(); - if (lastDoc != null) { - searchAfterSortId = FieldValue.of(lastDoc.getId()); - } else { - // 没有更多数据了 - break; - } - } else { - // 已经到最后一页 + // 如果没有更多结果,终止循环 + if (hits.isEmpty()) { + break; + } + + // 获取最后一条记录的 sort 值,用于下一页的 search_after + searchAfterSortValues = hits.get(hits.size() - 1).sort(); + + // 防止 sort 信息缺失导致死循环 + if (searchAfterSortValues == null || searchAfterSortValues.isEmpty()) { break; }