Java Elasticsearch按时间分组聚合查询

news/2024/7/7 5:57:34 标签: java, elasticsearch

核心代码

java">SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
DateHistogramAggregationBuilder aggregationBuilder = AggregationBuilders
		 // 分组别名
        .dateHistogram("dateDownStreamRequestTime")
         // 查询字段
        .field("downStreamRequestTime")
        .calendarInterval(DateHistogramInterval.DAY)
        .offset("-8h")
        .minDocCount(0)
        .order(BucketOrder.aggregation("_key", true));
sourceBuilder.aggregation(aggregationBuilder);

聚合查询示例

java">@Override
public RequestResult getDailyInvokeCount(InterfaceDTO interfaceDTO) throws Exception {
    Date queryRequestLogStartTime = DateUtil.toDate(interfaceDTO.getQueryRequestLogStartTime(), "yyyy-MM-dd HH:mm:ss");
    Date queryRequestLogEndTime = DateUtil.toDate(interfaceDTO.getQueryRequestLogEndTime(), "yyyy-MM-dd HH:mm:ss");
    List<Date> betweenDates = DateUtil.getBetweenDates(queryRequestLogStartTime, queryRequestLogEndTime);

    BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
    if (interfaceDTO.getOrderId() != null) {
        queryBuilder.must(QueryBuilders.termQuery("orderId", interfaceDTO.getOrderId()));
    }
    if (StringUtil.isNotEmpty(interfaceDTO.getPartnerId())) {
        queryBuilder.must(QueryBuilders.termQuery("partnerId", interfaceDTO.getPartnerId().toLowerCase()));
    }
    if (interfaceDTO.getServiceId() != null) {
        queryBuilder.must(QueryBuilders.termQuery("serviceId", interfaceDTO.getServiceId()));
    }
    if (StringUtil.isNotEmpty(interfaceDTO.getAppId())) {
        queryBuilder.must(QueryBuilders.termQuery("appId", interfaceDTO.getAppId().toLowerCase()));
    }
    if (interfaceDTO.getId() != null) {
        queryBuilder.must(QueryBuilders.termQuery("interfaceId", interfaceDTO.getId()));
    }
    queryBuilder.must(QueryBuilders.rangeQuery("downStreamRequestTime").from(queryRequestLogStartTime.getTime()).to(queryRequestLogEndTime.getTime()));

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    DateHistogramAggregationBuilder aggregationBuilder = AggregationBuilders
            .dateHistogram("dateDownStreamRequestTime")
            .field("downStreamRequestTime")
            .calendarInterval(DateHistogramInterval.DAY)
            .offset("-8h")
            .minDocCount(0)
            .order(BucketOrder.aggregation("_key", true));
    sourceBuilder.aggregation(aggregationBuilder);
    sourceBuilder.query(queryBuilder);

    SearchRequest searchRequest = new SearchRequest(getEsIndices(betweenDates));
    searchRequest.indicesOptions(IndicesOptions.fromOptions(true, true, true, false));
    searchRequest.source(sourceBuilder);

    List<Map<String, Object>> listMap = new ArrayList<>();

    SearchResponse searchResponse = eslClient.search(searchRequest, RequestOptions.DEFAULT);
    Aggregations aggregations = searchResponse.getAggregations();
    if (aggregations == null) {
        return RequestResult.success(interfaceInvokeEmptyData("day", "invokeCount", listMap));
    }

    Histogram histogram = searchResponse.getAggregations().get("dateDownStreamRequestTime");
    for (Histogram.Bucket entry : histogram.getBuckets()) {
        String key = entry.getKeyAsString();
        String time = DateUtil.toString(new Date(Long.parseLong(key)), "yyyy-MM-dd");

        Map<String, Object> map = new LinkedHashMap<>();
        map.put("day", time);
        map.put("invokeCount", entry.getDocCount());
        listMap.add(map);
    }

    for (Date betweenDate : betweenDates) {
        String tempDate = DateUtil.toString(betweenDate, "yyyy-MM-dd");
        Map<String, Object> findMap = listMap.stream().filter(p -> p.get("day").equals(tempDate)).findAny().orElse(null);
        if (findMap == null) {
            Map<String, Object> map = new LinkedHashMap<>();
            map.put("day", tempDate);
            map.put("invokeCount", 0);
            listMap.add(map);
        }
    }
    listMap.remove(listMap.size() - 1);
    listMap = listMap .stream().sorted(Comparator.comparing(map -> map.get("day").toString(), Comparator.naturalOrder())).collect(Collectors.toList());

    return RequestResult.success(listMap);
}

http://www.niftyadmin.cn/n/1022829.html

相关文章

Linux内核源码目录树结构

文件功能arch包含和硬件体系结构相关的代码&#xff0c;每种平台占一个相应的目录。和32位PC相关的代码存放在i386目录下&#xff0c;其中比较重要的包括kernel&#xff08;内核核心部分&#xff09;、mm&#xff08;内存管理&#xff09;、math-emu&#xff08;浮点单元仿真&a…

Python3连接Mysql8.0遇到的问题

最近在使用Python开发系统&#xff0c;需连接mysql数据库&#xff0c;我用的是Python3连接MySQL8.0&#xff0c;其中老是报错以下问题&#xff1a; 网上给了各种各样的方法&#xff0c;大多是通过各种方式修改密码。 最简单的方法是更换了root密码的认证方式解决的&#xff0c…

树莓派配置Linux内核源码

目录&#xff1a;1.获取编译所需源码&#xff1a;linux&#xff1a;tools&#xff1a;2.配置环境变量&#xff1a;3.配置config&#xff1a;&#xff08;1&#xff09;使用源码自带的 config&#xff1a;&#xff08;2&#xff09;获取当前树莓派的 config&#xff1a;4.编译&a…

53、keep-alive

&#xff08;1&#xff09;概念 及 作用 keep-alive是 Vue 提供的一个内置组件&#xff0c;用来对组件进行缓存——在组件切换过程中将状态保留在内存中&#xff0c;防止重复渲染DOM。 如果为一个组件包裹了 keep-alive&#xff0c;那么它会多出两个生命周期&#xff1a;deac…

Linux文件系统目录结构

1.根目录&#xff1a; 目录功能/bin存放一些二进制可执行文件&#xff08;如系统命令&#xff09;&#xff0c;普通用户和 root 都可以执行/boot存放系统启动目录&#xff0c;保存与系统启动相关的文件&#xff0c;如内核文件和启动引导程序&#xff08;grub&#xff09;文件等…

55、js事件冒泡和事件委托·

目录 1. 事件冒泡 2、阻止事件冒泡 2.1. event.stopPropagation()方法 2.2 event.target 3、addEventListener()方法&#xff08;事件监听&#xff09;&#xff1a; 4、事件委托 1. 事件冒泡 当一个元素上的事件被触发的时候&#xff0c;同样的事件将会在那个元素的所有…

Selenium元素定位实战

一、Selenium简述 Selenium是一个用于web应用程序的自动化测试工具。 Selenium直接运行在浏览器中&#xff0c;它可以模拟用户的行为操作。 Selenium支持IE、Google Chrome、Firefox、Opera等主流浏览器。 Selenium也支持主流开发语言&#xff0c;如Java、Python、C#等。 …

树莓派驱动框架

1.树莓派底层驱动框架&#xff1a; #include <linux/fs.h> //file_operations声明 #include <linux/module.h> //module_init module_exit声明 #include <linux/init.h> //__init __exit 宏定义声明 #include <linux/device.h> //cl…