Java ES 查询工具类 - 支持时间范围查询和倒序排序
以下是一个基于 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() 方法获取时间戳。
原文地址: https://www.cveoy.top/t/topic/oeAF 著作权归作者所有。请勿转载和采集!