该代码片段展示了如何使用 Elasticsearch 范围查询来筛选设备告警。

首先,代码检查 latestTsFromlatestTsTo 两个参数是否为空。如果这两个参数都不为空,则代码会使用 DateUtil.FetchTimestamp() 方法将它们转换为时间戳。

然后,根据 enumerate 参数的值,代码会创建不同的范围查询器。

  • enumerate 为 1 时,范围查询器会针对 DeviceCurrentAlarm.LATEST_TS 字段进行查询,并使用 latestTsFromLonglatestTsToLong 作为时间范围。
  • enumerate 为 2 时,范围查询器会针对 DeviceHistoryAlarm.CLEAR_TS 字段进行查询,并使用 latestTsFromLonglatestTsToLong 作为时间范围。
  • 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 变量来避免重复创建范围查询器。

使用时间戳筛选设备告警可以有效提高查询效率,缩短查询时间,提升用户体验。

Elasticsearch 范围查询优化:使用时间戳筛选设备告警

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

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