//page sort
Sort.TypedSort<PassengerFlow> passFlowSort = Sort.sort(PassengerFlow.class);
Sort sort = passFlowSort.by(PassengerFlow::getCreateTime).descending();
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
.withPageable(PageRequest.of(current, pageSize,sort))
.withQuery(boolQuery)
.withTrackScores(true)
.build();
nativeSearchQuery.setTrackTotalHits(true);
/**
* 这种搜索方式,大概分两个步骤这种方式返回的document与用户要求的size是相等的。
* 第一步,先向所有的shard发出请求,各分片只返回排序和排名相关的信息(注意,不包括文档document),然后按照各分片返回的分数进行重新排序和排名,取前size个文档。
* 第二步,去相关的shard取document。
*/
nativeSearchQuery.setSearchType(SearchType.QUERY_THEN_FETCH);
SearchHits<PassengerFlow> search = elasticsearchRestTemplate.search(nativeSearchQuery, PassengerFlow.class);
第一次用ElasticSearchRestTemplate
分页查询索引下信息时,数据经常对不上,很纳闷,在RequestFactory
类种找到了sourceBuilder
的加载方式:
if (query.getPageable().isPaged()) {
sourceBuilder.from((int) query.getPageable().getOffset());
sourceBuilder.size(query.getPageable().getPageSize());
} else {
sourceBuilder.from(0);
sourceBuilder.size(INDEX_MAX_RESULT_WINDOW);
}
发现PageRequest
中的page
原来不是对应着from
。
所以直接传对应的页码就可以了。