<aside> 💡 ES为了避免深分页,不允许使用分页(from&size)查询10000条以后的数据,因此如果要查询第10000条以后的数据,要使用ES提供的 scroll(游标) 来查询

</aside>

原理

实践

ElasticSearchTemplate

@Test
public void testScorll() {
    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

    NativeSearchQuery build = new NativeSearchQueryBuilder()
            .withQuery(boolQueryBuilder)
            .withIndices().build();
    //获取s
    Page<PatientInfo> patientInfos = elasticsearchTemplate.startScroll(1000, build, PatientInfo.class);
    printJson(patientInfos);
    Page<PatientInfo> nextPatientInfos = elasticsearchTemplate.continueScroll(((AggregatedPageImpl) patientInfos).getScrollId(), 1000, PatientInfo.class);
    printJson(nextPatientInfos);
}

查询全部

/**
 * query all by searchQuery from es
 * @author fujian
 *
 */
public <T> List<T> queryAll(SearchQuery searchQuery, Class<T> T) {

    String scrollId = scan(searchQuery, 5000l, false);

    List<T> entities = new ArrayList<>();
    boolean hasRecords = true;
    while (hasRecords) {
        SearchResponse searchResponse = getClient().prepareSearchScroll(scrollId).
                setScroll(new TimeValue(5000l)).execute().actionGet();

        Page<T> page = getResultsMapper().mapResults(searchResponse, T, null);
        if(page.hasContent()) {
            entities.addAll(page.getContent());
            scrollId = searchResponse.getScrollId();
        } else {
            hasRecords = false;
        }
    }

    clearScroll(scrollId);

    return entities;

}