要查询每天 6:00 到 24:00 的数据,可以使用 Elasticsearch 的 range 查询和时间范围过滤器。以下是一个示例代码:

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.index.query.RangeQueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZoneOffset;

public class ElasticsearchQueryExample {
    
    private static final String INDEX_NAME = 'your_index_name';
    
    public static void main(String[] args) {
        try (RestHighLevelClient client = new RestHighLevelClient()) {
            SearchRequest searchRequest = new SearchRequest(INDEX_NAME);
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            
            // 构建时间范围过滤器
            RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery('@timestamp')
                    .gte(getDateTimeWithOffset(LocalDate.now(), LocalTime.of(6, 0), ZoneOffset.UTC))
                    .lte(getDateTimeWithOffset(LocalDate.now(), LocalTime.of(23, 59, 59), ZoneOffset.UTC));

            // 创建bool查询
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().filter(rangeQueryBuilder);
            searchSourceBuilder.query(boolQueryBuilder);
            
            // 设置其他查询参数,例如size、timeout等
            searchSourceBuilder.size(10);
            searchSourceBuilder.timeout(TimeValue.timeValueSeconds(10));
            
            searchRequest.source(searchSourceBuilder);
            
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            
            // 处理查询结果
            // ...
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    // 获取带有时区偏移的日期时间
    private static long getDateTimeWithOffset(LocalDate date, LocalTime time, ZoneOffset zoneOffset) {
        return time.atDate(date).toEpochSecond(zoneOffset);
    }
}

在上面的代码中,我们首先创建了一个SearchRequest对象,指定了要查询的索引名称。然后,我们构建了一个SearchSourceBuilder对象,并创建了一个范围查询过滤器RangeQueryBuilder,用于过滤@timestamp字段的时间范围。我们使用gte方法指定起始时间为当天的 6:00,使用lte方法指定结束时间为当天的 23:59:59。

接下来,我们创建了一个BoolQueryBuilder对象,并将范围查询过滤器添加到其中的过滤器子句中。这将保证只返回位于指定时间范围内的文档。

最后,我们设置了其他查询参数,例如查询的文档数量、超时时间等。然后,我们将SearchSourceBuilder对象设置为SearchRequest的 source,并使用RestHighLevelClient执行查询。

请注意,上述示例中的代码仅用于演示目的,你需要根据实际的索引结构和字段名称进行适当的调整。


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

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