Elasticsearch search_after java查詢

/**
     * 實時統計查詢
     * @param dto
     * @param esSkip
     * @param pageSize
     * @return
     */
    public Map<String, Object> queryCommonMetricByTime(final QueryCommonV1DTO dto, final String esSkip, final Integer pageSize) {
        final Map<String, Object> map = new HashMap<>();
        final JSONArray resultArray = new JSONArray();
   
        if(!existTable(dto.getIndex())) {
            return map;
        }
        
        final BoolQueryBuilder boolQueryBuild = QueryBuilders.boolQuery();
        //兩個時間
        if(StringUtils.isEmpty(dto.getStartTime())) {
            final QueryBuilder rangeBuilder = QueryBuilders.rangeQuery("timestamp").lte(dto.getEndTime());
            boolQueryBuild.filter(rangeBuilder);
        }else {
            final QueryBuilder rangeBuilder = QueryBuilders.rangeQuery("timestamp").gte(dto.getStartTime()).lte(dto.getEndTime());
            boolQueryBuild.filter(rangeBuilder);
        }
        //設備id
        final QueryBuilder deviceIdTermsBuilder = QueryBuilders.termQuery("deviceid", dto.getDeviceCode());
        boolQueryBuild.filter(deviceIdTermsBuilder);
        //測點
        if(!StringUtils.isEmpty(dto.getMetric())) {
            final QueryBuilder metricTermsBuilder = QueryBuilders.termQuery("metric", dto.getMetric());
            boolQueryBuild.filter(metricTermsBuilder);
        }
        //查詢列表
        SearchRequestBuilder requestBuilder = getTransportClient().prepareSearch(dto.getIndex()).setTypes(dto.getIndex())
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
        requestBuilder.setQuery(boolQueryBuild);
        requestBuilder.addSort(SortBuilders.fieldSort(TIMESTAMP).order(SortOrder.DESC));
        requestBuilder.addSort(SortBuilders.fieldSort("_uid").order(SortOrder.ASC));
        requestBuilder.setFrom(0);
        requestBuilder.setSize(pageSize);
        if(!StringUtils.isEmpty(esSkip)) {
            Object[] skip = esSkip.split("@");
            requestBuilder.searchAfter(skip);
        }
        if (LOGGER.isInfoEnabled()) {
            LOGGER.info("##### 調用queryCommonMetricByTime聚合語句:\n{} \n#####", requestBuilder.toString());
        }
        // 4.執行查詢
        final SearchResponse response = requestBuilder.execute().actionGet();
        final SearchHits searchHits = response.getHits();
        //總數
        long totalHits = searchHits.totalHits();
        map.put("count", totalHits);
        // 解析結果
        final SearchHit[] hits = searchHits.getHits();
        if (hits.length > 0) {
            for (SearchHit hit : hits) {
                final Map<String, Object> source = hit.getSource();
                // 只返回倆個字段
                final JSONObject obj = new JSONObject();
                // 時間改成time返回
                obj.put("time", source.get(BaseField.timestamp));
                obj.put(BaseField.metric, source.get(BaseField.metric));
                resultArray.add(obj);
            }
            map.put("data", resultArray);
            
            final Object[] sort = hits[hits.length-1].sortValues();
            final StringBuffer skip = new StringBuffer();
            for(Object obj : sort) {
                skip.append(obj + "@");
            }
            skip.deleteCharAt(skip.length()-1);
            map.put("skip", skip);
        }   
        return map;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章