ES条件分页查询与不分页处理

分页查询:

if (item.getItem().getEndDate() != null) {
    item.getItem().setEndDate(item.getItem().getEndDate().plusDays(1));
}

Pageable pageable = PageRequest.of(item.getPageNo() - 1, item.getPageSize());
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
DrugManageQueryDto searchItem = item.getItem();
if(!StringUtils.isEmpty(searchItem.getWmsCode())) {
    boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("wmsCode", searchItem.getWmsCode()));
}

if(!StringUtils.isEmpty(searchItem.getMaterielCode())) {
    boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("materielCode", searchItem.getMaterielCode()));
}

if(searchItem.getStartDate() != null) {
    long startDate = searchItem.getStartDate().atStartOfDay().toInstant(ZoneOffset.of("+8")).toEpochMilli();
    boolQueryBuilder.must(rangeQuery("createDate").gte(startDate));
}

if(searchItem.getEndDate() != null) {
    long endDate = searchItem.getEndDate().atStartOfDay().toInstant(ZoneOffset.of("+8")).toEpochMilli();
    boolQueryBuilder.must(rangeQuery("createDate").lte(endDate));
}
nativeSearchQueryBuilder.withQuery(boolQueryBuilder).withSort(SortBuilders.fieldSort("createDate").order(SortOrder.DESC));
SearchQuery searchQuery = nativeSearchQueryBuilder.withPageable(pageable).build();
Page<StockOrderPickDetailEs> search = stockOrderPickDetailRepository.search(searchQuery);
PageInfos result;
if(search.getTotalElements() > 0) {
    result = new PageInfos(item.getPageNo(), item.getPageSize(), search.getTotalElements(), search.getTotalPages(), search.getContent());
} else {
    result = new PageInfos(item.getPageNo(), item.getPageSize(), 0, 0, new ArrayList<StockOrderPickDetailEs>());
}
return result;

不分页查询条件下所有的数据:

List<StockDrugCodeEs> result = new ArrayList<>();
Criteria criteria = new Criteria("epc").is(epc);
CriteriaQuery criteriaQuery = new CriteriaQuery(criteria);
CloseableIterator<StockDrugCodeEs> stockDrugCodes = elasticsearchTemplate.stream(criteriaQuery, StockDrugCodeEs.class);

while (stockDrugCodes.hasNext()) {
    result.add(stockDrugCodes.next());
}
return result;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于千万级精确分页查询Elasticsearch提供了一些有效的方法。下面是一些建议: 1. 使用 Scroll API:在传统的分页方式中,每次查询都会重新计算结果,这对于千万级的数据集来说是非常耗时的。而使用Scroll API,可以一次性获取所有结果,并使用游标来逐步滚动获取数据。这种方式避免了重复计算,提高了查询效率。 2. 使用 Search After:Search After是一种基于游标的分页方式,可以避免深度分页(深度分页指的是用户请求的页数非常大,超过了Elasticsearch默认设置的10000的最大查询结果数)。使用Search After可以在每次查询中通过传递上一次查询结果的最后一个排序值来获取下一页的结果。 3. 优化查询性能:对于千万级数据集,查询性能的优化非常重要。可以考虑以下几点来提高查询性能: - 使用合适的索引(包括字段类型、分词器和分析器)和映射设置。 - 避免在查询中执行复杂的聚合操作。 - 如果可能,尽量使用过滤器而不是查询来限制结果集。 - 如果需要排序,可以考虑在索引时预先排序或使用排序脚本来提高查询性能。 4. 使用分片优化:分布式架构中,数据会分布在多个分片上。可以通过合理设置分片数、副本数和路由策略来优化查询性能。请注意,过多的分片数可能会导致性能下降,因此需要权衡利弊。 请根据具体情况选择适合的方法进行千万级精确分页查询
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值