ElasticSearch scan、scrollid简单使用,超过10000条数量限制

版本 : spring-data-elasticsearch-2.1.8.RELEASE.jar

public List<Long> searchIds(Param param) {
	
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
    		.withQuery(queryBuilder)
    		.withIndices("index") 
    		.withTypes("type")
            .withPageable(new PageRequest(0, 1000)).build();  
    String scrollId = elasticsearchTemplate.scan(searchQuery, 1000*60, false);  
    
    List<Long> ids = new ArrayList<Long>(12000);  
    boolean hasRecords = true;  
    while (hasRecords) {  
        Page<EsEntity> page = elasticsearchTemplate.scroll(scrollId, 1000*60, EsEntity.class);  
        if (page.hasContent()) {  
        	page.getContent().forEach(item -> ids.add(item.getId()));
        } else {  
            hasRecords = false;  
        }  
    }  
    elasticsearchTemplate.clearScroll(scrollId);  


	return ids;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Elasticsearch中,通过使用Search After API可以解决默认返回10000数据的限制。这个API可以让你从上一个查询结果的最后一记录开始下一次查询。这个API需要一个游标参数,这个参数是上一次查询结果中最后一记录的排序值,然后下一次查询时将这个参数传入就可以继续从这个游标位置开始查询。 在Java中使用Search After API,你需要使用SearchRequestBuilder和SearchResponse对象。首先,你需要构建一个SearchRequestBuilder实例,然后设置查询件和游标参数。接着,你可以通过execute()方法执行查询,并且可以从SearchResponse对象中获取结果。 以下是一个使用Search After API进行查询的示例代码: ``` SearchRequestBuilder searchRequestBuilder = client.prepareSearch("index_name") .setTypes("doc_type") .setQuery(QueryBuilders.matchAllQuery()) .addSort(SortBuilders.fieldSort("sort_field").order(SortOrder.ASC)) .setSize(100); SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); while (true) { SearchHits hits = searchResponse.getHits(); if (hits.getHits().length == 0) { break; } for (SearchHit hit : hits) { // 处理查询结果 } // 获取最后一记录的排序值作为游标参数 SearchHit lastHit = hits.getHits()[hits.getHits().length - 1]; Object[] sortValues = lastHit.getSortValues(); // 设置游标参数并继续查询 searchRequestBuilder = client.prepareSearch("index_name") .setTypes("doc_type") .setQuery(QueryBuilders.matchAllQuery()) .addSort(SortBuilders.fieldSort("sort_field").order(SortOrder.ASC)) .setSize(100) .setSearchAfter(sortValues); searchResponse = searchRequestBuilder.execute().actionGet(); } ``` 在上面的示例代码中,我们首先设置了查询件和排序参数,然后执行第一次查询,并且通过获取最后一记录的排序值作为游标参数,然后设置游标参数并执行下一次查询,直到查询结果为空为止。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值