以时间存储es索引比如index_2023_06_05 前端传值开始和结束时间如何用java代码去查询区间范围内es的数据
时间: 2024-03-11 18:48:32 浏览: 63
JAVA实现按时间段查询数据操作
以下是 Java 代码示例,用于查询指定时间范围内的 Elasticsearch 数据:
```java
import org.elasticsearch.action.search.SearchResponse;
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.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class ElasticsearchQuery {
private RestHighLevelClient client;
// 索引名称的前缀
private String indexPrefix = "index_";
// 时间字段名称
private String timeFieldName = "time_field";
/**
* 查询指定时间范围内的数据
*
* @param startTime 开始时间,格式为 "yyyy-MM-dd HH:mm:ss"
* @param endTime 结束时间,格式为 "yyyy-MM-dd HH:mm:ss"
* @param from 分页起始位置,从 0 开始计数
* @param size 分页大小
* @return 查询结果
* @throws IOException
*/
public List<String> queryByTimeRange(String startTime, String endTime, int from, int size) throws IOException {
// 构建查询条件
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 时间范围查询
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(timeFieldName)
.format("yyyy-MM-dd HH:mm:ss")
.gte(startTime)
.lte(endTime);
boolQueryBuilder.must(rangeQueryBuilder);
// 构建查询源
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(boolQueryBuilder);
sourceBuilder.from(from);
sourceBuilder.size(size);
// 设置高亮显示
HighlightBuilder highlightBuilder = new HighlightBuilder()
.field(timeFieldName);
sourceBuilder.highlighter(highlightBuilder);
// 查询
SearchResponse searchResponse = client.search(sourceBuilder);
// 处理查询结果
SearchHit[] hits = searchResponse.getHits().getHits();
List<String> resultList = new ArrayList<>();
for (SearchHit hit : hits) {
String result = hit.getSourceAsString();
resultList.add(result);
}
return resultList;
}
}
```
在上面的代码中,`queryByTimeRange` 方法用于查询指定时间范围内的数据,其中:
- `startTime` 和 `endTime` 参数分别表示查询的时间范围;
- `from` 和 `size` 参数分别表示分页的起始位置和大小;
- `indexPrefix` 和 `timeFieldName` 参数分别表示 Elasticsearch 索引名称的前缀和时间字段名称;
- `RestHighLevelClient` 类是 Elasticsearch 提供的高级 REST 客户端,需要自行初始化并传入。
在使用该方法前,需要先初始化 `RestHighLevelClient` 类,具体做法可以参考 Elasticsearch 官方文档和示例代码。
阅读全文