可以使用范围查询和布尔查询的组合来实现该需求。具体实现如下:

import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import java.time.Instant;

// 获取当前时间戳
long now = Instant.now().getEpochSecond();

// 获取一个月前的时间戳
long oneMonthAgo = Instant.now().minusSeconds(30 * 24 * 60 * 60).getEpochSecond();

// 获取一个月内的某个时间段的时间戳范围
long startTime = Instant.parse("2022-01-01T00:00:00Z").getEpochSecond();
long endTime = Instant.parse("2022-01-10T00:00:00Z").getEpochSecond();

// 构建一个bool查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

// 添加一个must范围查询,查询latestTs字段在一个月内的数据
boolQueryBuilder.must(QueryBuilders.rangeQuery("latestTs")
        .gte(oneMonthAgo)
        .lte(now));

// 添加一个should范围查询,查询latestTs字段在一个月内的某个时间段的数据
boolQueryBuilder.should(QueryBuilders.rangeQuery("latestTs")
        .gte(startTime)
        .lte(endTime));

// 设置should查询的最小匹配数为1,即必须至少匹配一个should查询
boolQueryBuilder.minimumShouldMatch(1);

// 执行查询
SearchResponse response = client.prepareSearch("index")
        .setQuery(boolQueryBuilder)
        .execute()
        .actionGet();

在上面的代码中,我们首先获取了当前时间戳和一个月前的时间戳,然后获取了一个月内的某个时间段的时间戳范围。接着,我们使用BoolQueryBuilder构建了一个bool查询,并添加了一个must范围查询,查询latestTs字段在一个月内的数据;添加了一个should范围查询,查询latestTs字段在一个月内的某个时间段的数据;最后设置should查询的最小匹配数为1,即必须至少匹配一个should查询。最终,我们执行查询并获取查询结果

java构建es查询条件根据latestTs字段同时满足查询一个月内的数据和一个月内的某个时间段的数据

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

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