ElasticSearch scroll查詢 api


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();
        }
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM