Elasticsearch 范围查询优化:使用时间戳筛选设备告警
该代码片段展示了如何使用 Elasticsearch 范围查询来筛选设备告警。
首先,代码检查 latestTsFrom 和 latestTsTo 两个参数是否为空。如果这两个参数都不为空,则代码会使用 DateUtil.FetchTimestamp() 方法将它们转换为时间戳。
然后,根据 enumerate 参数的值,代码会创建不同的范围查询器。
- 当
enumerate为 1 时,范围查询器会针对DeviceCurrentAlarm.LATEST_TS字段进行查询,并使用latestTsFromLong和latestTsToLong作为时间范围。 - 当
enumerate为 2 时,范围查询器会针对DeviceHistoryAlarm.CLEAR_TS字段进行查询,并使用latestTsFromLong和latestTsToLong作为时间范围。 - 当
enumerate为 3 时,范围查询器会针对DeviceScreenedAlarm.LATEST_TS字段进行查询,并使用DateUtil.muchTime()和System.currentTimeMillis()作为时间范围。
最后,代码会将范围查询器添加到 boolQueryBuilder 中,并使用 filter() 或 must() 方法将其应用到查询条件中。
代码优化后的版本:
if (StringUtils.isNotBlank(latestTsFrom) && StringUtils.isNotBlank(latestTsTo)) {
Long latestTsFromLong = DateUtil.FetchTimestamp(latestTsFrom);
Long latestTsToLong = DateUtil.FetchTimestamp(latestTsTo);
RangeQueryBuilder rangeQueryBuilder = null;
switch (enumerate) {
case 1:
rangeQueryBuilder = QueryBuilders.rangeQuery(DeviceCurrentAlarm.LATEST_TS);
break;
case 2:
rangeQueryBuilder = QueryBuilders.rangeQuery(DeviceHistoryAlarm.CLEAR_TS);
break;
case 3:
rangeQueryBuilder = QueryBuilders.rangeQuery(DeviceScreenedAlarm.LATEST_TS)
.gte(DateUtil.muchTime())
.lte(System.currentTimeMillis());
boolQueryBuilder.must(rangeQueryBuilder);
break;
}
if (rangeQueryBuilder != null) {
rangeQueryBuilder.gte(latestTsFromLong).lte(latestTsToLong);
boolQueryBuilder.filter(rangeQueryBuilder);
}
}
优化后的代码使用 switch 语句来简化代码逻辑,并使用 rangeQueryBuilder 变量来避免重复创建范围查询器。
使用时间戳筛选设备告警可以有效提高查询效率,缩短查询时间,提升用户体验。
原文地址: http://www.cveoy.top/t/topic/onil 著作权归作者所有。请勿转载和采集!