ES时间分组统计查询

这篇具有很好参考价值的文章主要介绍了ES时间分组统计查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

//创建索引
PUT /test
//索引结构
PUT /test/_mapping
{
  "properties": {
   
    "insertTime": {
      "type": "date"
    },
    "id": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    },
   
    "pmValue": {
      "type": "double"
    }
  }
}
//批量插入数据
PUT /test/_bulk
{"index":{}}
{"id":1000,"pmValue":20.13,"insertTime":"2022-08-21"}
{"index":{}}
{"id":2000,"pmValue":20.13,"insertTime":"2022-08-22"}
{"index":{}}
{"id":3000,"pmValue":20.13,"insertTime":"2022-08-20"}
{"index":{}}
{"id":4000,"pmValue":20.13,"insertTime":"2022-08-22"}
{"index":{}}
{"id":5000,"pmValue":20.13,"insertTime":"2022-08-22"}
{"index":{}}
{"id":6000,"pmValue":20.13,"insertTime":"2022-08-22"}
{"index":{}}
{"id":7000,"pmValue":20.13,"insertTime":"2022-08-22"}
{"index":{}}
{"id":8000,"pmValue":20.13,"insertTime":"2022-08-19"}

按照id、时间分组求pmValue的平均值
GET /test/_search
{
  
  "size": 0,
  "aggs": {
    "ID": {
      "terms": {
        "field": "id.keyword"
      },
      "aggs": {
        "时间": {
          "date_histogram": {
            "field": "insertTime",
            "interval": "day",
            "format": "yyyy-MM-dd",
            "min_doc_count": 0,
            "extended_bounds": {
              "min": "2022-08-14",
              "max": "2022-08-20"
            }
          },
          "aggs": {
            "平均值": {
              "avg": {
                "field": "pmValue"
              }
            }
          }
        }
      }
    }
  }
}





查询结果:
ES时间分组统计查询,ES,elasticsearch,mybatis,java
以上对应的Java代码

@Autowired
	private RestHighLevelClient client;
public Map<Object,List<Map<String,Object>>> searchFlow(String index,List<Map<String,Object>> paramList){
		//搜索请求
		SearchRequest request = new SearchRequest(index);
		//请求条件构建器,这里和mybatis中的自定义查询有点类型
		SearchSourceBuilder builder = new SearchSourceBuilder();
		BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
		BoolQueryBuilder query = QueryBuilders.boolQuery();
		for (Map<String, Object> map : paramList) {
			BoolQueryBuilder query1 = QueryBuilders.boolQuery();
			map.forEach((k, v) -> {
				query1.must(QueryBuilders.termsQuery(k + ".keyword", v));
			});
			query.should(query1);
		}
		boolQueryBuilder.must(query);


//其他查询条件
		boolQueryBuilder.must(QueryBuilders.termsQuery("字段" + ".keyword", "字段值"));
		

		//id分组
		TermsAggregationBuilder linkAgg = AggregationBuilders.terms("linkAgg").field("id.keyword");
		//时间分组
		String extendedBoundsMin = DateUtil.format(DateUtil.offsetDay(new Date(), -6), "yyyy-MM-dd");
		String extendedBoundsMax = DateUtil.format(new Date(), "yyyy-MM-dd");
		DateHistogramAggregationBuilder dateHistogramAggregationBuilder = AggregationBuilders
				.dateHistogram("timeAgg").field("insertTime").dateHistogramInterval(DateHistogramInterval.DAY)
				.format("yyyy-MM-dd").minDocCount(0).extendedBounds(new ExtendedBounds(extendedBoundsMin,extendedBoundsMax));

		//取出速率的平均值
		AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("outSpeedAvg").field("pmValue");
		dateHistogramAggregationBuilder.subAggregation(avgAggregationBuilder);
		linkAgg.subAggregation(dateHistogramAggregationBuilder);

		builder.aggregation(linkAgg);
		builder.query(boolQueryBuilder);
		builder.size(10000);
		//把查询添加放入请求中
		request.source(builder);
		//建立SearchResponse
		SearchResponse response;
		Map<Object,List<Map<String,Object>>> map = new HashMap<>(16);
		try {

			response = client.search(request, RequestOptions.DEFAULT);
			Aggregations aggregations = response.getAggregations();
			Terms linkResTerms = aggregations.get("linkAgg");
			List<? extends Terms.Bucket> linkIdBuckets = linkResTerms.getBuckets();

			if (linkIdBuckets != null) {
				for (Terms.Bucket bucket:linkIdBuckets){
					List<Map<String,Object>> list = new ArrayList<>();
					Object linkId = bucket.getKey();
					Aggregations aggregations1 = bucket.getAggregations();
					ParsedDateHistogram dateHistogram =  aggregations1.get("timeAgg");
					List<? extends Histogram.Bucket> timeBuckets = dateHistogram.getBuckets();
					if (timeBuckets != null) {
						for (Histogram.Bucket bucket1:timeBuckets) {
							Map<String,Object> valueMap = new HashMap<>(16);
							String time = bucket1.getKeyAsString();
							Aggregations aggregations2 = bucket1.getAggregations();
							Avg outSpeedAvg = aggregations2.get("outSpeedAvg");
							double value = outSpeedAvg.getValueAsString() == "Infinity"?0:Double.valueOf(outSpeedAvg.getValueAsString());
							valueMap.put("time",time);
							valueMap.put("value",value);
							list.add(valueMap);
						}
						map.put(linkId,list);
					}

				}
			}

		} catch (Exception e) {
			   log.error("es查询异常",e);
		}
		return map;

	}

更多内容课参考:
https://www.cnblogs.com/xiaoyh/p/16264715.html文章来源地址https://www.toymoban.com/news/detail-524574.html

到了这里,关于ES时间分组统计查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java Elasticsearch多条件分组聚合查询

    需求         在项目开发中,需要从elasticsearch中查询日志数据,先统计每一天的日志调用量,然后在每一天的分组聚合基础上,再分组聚合统计成功和失败的日志调用量。 代码

    2024年02月08日
    浏览(55)
  • 【Elasticsearch】ES精确查询和范围查询,ES时间字段排序实例,ES倒排索引介绍

    termQuery matchQuery 模糊查询 multiMatchQuery 多个字段模糊查询 如果时间字段写入时用的类型是Text,可以用“时间字段.keyword”来处理 #查询前传入分页参数 #分页后拿到总记录数 把文档D对应到的映射转换为到文档ID的映射,每个都对应着一系列的文档,这些文

    2024年02月15日
    浏览(118)
  • ES统计分组后的分组数量

    工作中遇到需要统计分组数量的查询,记录一下 ps: 按区域分组, 统计有几个区域 结果

    2024年02月07日
    浏览(52)
  • MYSQL之查询按日期分组统计

    1.1、dayofyear、dayofmonth、dayofweek dayofyear(date) 函数返回日期位于所在年份的第几天,范围是1 ~ 366 dayofmonth(date) 函数返回日期位于所在月份的第几天,范围是1 ~ 31 dayofweek(date) 函数返回日期位于所在周的第几天,范围是1 ~ 7 查询语句 查询结果    需要注意的是,如果是 dayofmon

    2024年02月02日
    浏览(43)
  • Mysql的分组查询和统计计算

    1.聚合函数 聚合函数实现数据的统计计算,用于计算表中的数据,返回单个计算结果。聚合函数包括COUNT、SUM、AVG、MAX、MIN等函数,下面分别介绍。 (1)COUNT函数 COUNT函数用于计算组中满足条件的行数或总行数。 语法格式: COUNT ( { [ ALL | DISTINCT ] 表达式 } | * ) 其中,ALL表示

    2024年02月16日
    浏览(39)
  • MySQL时间分组:按小时统计数据(mysql按小时分组)

    MySQL时间分组是一类涉及MySQL数据库的SQL语句,能够以小时对数据进行分组统计。 比如,如果你想根据一定的时间间隔,把MySQL数据库中的记录分成几组,那么MySQL时间分组技术就派上用场了。 MySQL时间分组主要使用MySQL语句YEAR(), WEEK(), HOUR()和GROUP BY来实现,按小时统计数据实

    2024年02月12日
    浏览(54)
  • 使用Elasticsearch进行分组聚合统计

    要使用Elasticsearch进行分组聚合统计,可以使用聚合(aggregation)功能。聚合操作允许您根据指定的条件对文档进行分组,并计算每个分组的聚合结果。 针对普通类型的字段,DSL构建语法: aggs: aggregations的别名,代表着分组 agg_name: 这个是自定义的名字,可以针对你自己

    2024年02月15日
    浏览(46)
  • elastic search es 分组统计 aggs 次数用法

    参考链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html es 各个版本的语法可能会不一样,如果大家在用的时候发现语法报错了,请查阅相关版本的语法。 刚需要按 ip 地址统计某个接口的访问次数,查了下 es 分组统计次数 aggs 的用法,特此记录一下,方

    2024年02月11日
    浏览(58)
  • ES es Elasticsearch 十三 Java api 实现搜索 分页查询 复杂查询 过滤查询 ids查询 等

    目录 Java api 实现搜索 Pom.xml 建立链接 搜索全部记录 增加规则值查某些字段 搜索分页 全代码 Ids 搜索 搜索Match搜索 multi_match 搜索 多字段搜索 复杂查询 bool查询 filter  bool 复杂查询增加过滤器查询 复杂擦好像加排序 日志 思路 参考 api 写法 写Java代码 请求条件构建层次

    2024年02月04日
    浏览(60)
  • 如何使用ES做简单的时间条件过滤+模糊查询+精确匹配+关键字排除,查询 elasticsearch查询结果包含或排除某些字段、_source查询出需要的属性名称

    目录 一、时间条件过滤+模糊查询+精确匹配+排除 1. 查询出包含 log_geo 的数据 “wildcard”: { “message”: “log_geo” } 2. 查询某个时间段的数据 3. 条件查询与条件排除数据 4. from 表示起始的记录的ID 5. size 表示显示的记录数 6.sort排序 desc降序、asc升序  7.should查询在mysql中

    2024年01月18日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包