以下是一个基于 Java 的 ES 查询工具类,支持时间范围查询并按时间倒序排序:

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;

public class ESQueryUtils {

    private static final String DATE_FORMAT = 'yyyy-MM-dd'T'HH:mm:ss.SSS'Z';
    private static final TimeZone UTC_TIMEZONE = TimeZone.getTimeZone('UTC');

    public static SearchResponse queryWithTimeRange(RestHighLevelClient client, String indexName, String timeFieldName,
            String startTime, String endTime, int size) throws IOException, ParseException {
        SearchRequest searchRequest = new SearchRequest(indexName);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        // 时间范围查询
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
        dateFormat.setTimeZone(UTC_TIMEZONE);
        Date start = dateFormat.parse(startTime);
        Date end = dateFormat.parse(endTime);
        boolQueryBuilder.must(QueryBuilders.rangeQuery(timeFieldName).gte(start.getTime()).lte(end.getTime()));
        searchSourceBuilder.query(boolQueryBuilder);

        // 排序
        searchSourceBuilder.sort(SortBuilders.fieldSort(timeFieldName).order(SortOrder.DESC));

        // 分页
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(size);

        searchRequest.source(searchSourceBuilder);
        return client.search(searchRequest, RequestOptions.DEFAULT);
    }

    public static void printSearchResponse(SearchResponse response) {
        SearchHit[] hits = response.getHits().getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
    }
}

使用方法:

RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost('localhost', 9200, 'http')));

String indexName = 'your_index_name';
String timeFieldName = 'reportingTime';
String startTime = '2021-01-01T00:00:00.000Z';
String endTime = '2021-01-31T23:59:59.999Z';
int size = 10;

SearchResponse response = ESQueryUtils.queryWithTimeRange(client, indexName, timeFieldName, startTime, endTime, size);
ESQueryUtils.printSearchResponse(response);

client.close();

其中,client 是 ES 客户端,indexName 是要查询的索引名称,timeFieldName 是时间字段名称,startTime 是查询的起始时间,endTime 是查询的结束时间,size 是查询结果数量。

queryWithTimeRange 方法返回一个 ES 查询响应对象 SearchResponse,可以通过 printSearchResponse 方法将结果打印出来。

注意,时间字段类型为字符串时,需要将字符串转换为时间戳进行比较。上面的代码中使用了 SimpleDateFormat 类将字符串转换为时间对象,然后调用 getTime() 方法获取时间戳。

Java ES 查询工具类 - 支持时间范围查询和倒序排序

原文地址: https://www.cveoy.top/t/topic/oeAF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录