1、scroll深度搜索,查詢符合條件的所有數據。如果不是scroll深度搜索默認之后返回20條數據,如果指定分頁就返回分頁的條數。
package com.example.demo; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; import java.util.List; import java.util.Map; public class TestDemo { @Autowired PreBuiltTransportClient preBuiltTransportClient; /** * 查詢所有數據 * @param indices * @param type * @param queryBuilder * @param pageSize * @return */ public List<Map<String,Object>> searchAllData(String indices, String type, QueryBuilder queryBuilder, Integer pageSize){ List result = new ArrayList<>(); List tmpList = new ArrayList<>(); SearchResponse scrollResp = preBuiltTransportClient.prepareSearch(indices) .setTypes(type) .setScroll(new TimeValue(60000)) .setQuery(queryBuilder) .setSize(pageSize).get(); do { for (SearchHit hit : scrollResp.getHits().getHits()) { tmpList.add(hit.getSourceAsMap()); } result.addAll(tmpList); tmpList.clear(); scrollResp = preBuiltTransportClient.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet(); } while (scrollResp.getHits().getHits().length != 0); return result; } /** * 查詢職位是經理而且工資1萬元以上的員工,然后計算他們的年終獎金 * @param index * @param type */ public void calculateBonus(String index,String type){ try{ Integer pageSize = 100; BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); //查詢條件1: 工資是1萬元以上 boolQueryBuilder.must(QueryBuilders.rangeQuery("salary").gt(10000)); //查詢條件2:職位是經理級別 boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("level","經理")); List<Map<String, Object>> dataList = this.searchAllData(index, type, boolQueryBuilder, pageSize); if(dataList != null){ for(Map<String, Object> data : dataList){ //業務邏輯處理,例如:計算年終獎金 } } }catch (Exception e){ e.printStackTrace(); } } }