使用Java API的ElasticSearch日期范围查询聚合
嗨,我有供cpu使用的文档,其中包含date_time字段。现在,我想查找日期范围内的avg cpu用法。我想出了以下解决方案。如果我是Elastic
Search的新手,请告诉我是否有任何先进或更好的方法。
client.prepareSearch("myindex"). setTypes("mytype").
setQuery(
QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),
FilterBuilders.andFilter(FilterBuilders.termFilter("server","x"),
FilterBuilders.rangeFilter(date_time).from(fdate).to(tdate)))).get()
现在,上面的查询返回我期望的文档,该文档在/日期范围内。现在,我要做的是,使用这些文档找到所有唯一的日期,SearchHits
并将这些唯一的日期组合存储在中,HashSet
然后针对其中的所有项目HashSet
执行以下查询
client.prepareSearch("myindex"). setTypes("mytype").
setQuery(
QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),
FilterBuilders.andFilter(FilterBuilders.termFilter("server","x"),
FilterBuilders.termFilter(date_time),"dateinputfromloop"))).
addAggregation(AggregationBuilders.avg("cpu_agg").field("cpu_time"))
.get()
现在上面的查询工作正常,并给出了每个日期时间组合的平均CPU输出。我想知道是否有更好的方法,因为我在循环中针对所有日期组合执行上述查询。请提前指导谢谢。
回答:
因此,我认为您可以每天获取数据,可以为此使用date_histogram聚合。因此,您的两个请求可以在单个请求中完成。
这是代码,
client.prepareSearch("myindex"). setTypes("mytype").
setQuery(
QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),
FilterBuilders.andFilter(FilterBuilders.termFilter("server","x"),
FilterBuilders.rangeFilter("date_time").from("fdate").to("tdate")))).
addAggregation(
AggregationBuilders.dateHistogram("dateagg").field("date_time").interval(DateHistogram.Interval.DAY)
.subAggregation(
AggregationBuilders.avg("cpu_agg").field("cpu_time")
)
)
.get();
您可以更改dateHistogram聚合中的间隔以适合您的需求。
如果要基于唯一性(也以毫秒为单位),则可以将术语聚合用于日期而不是日期直方图聚合。
术语汇总
基于多桶值源的聚合,其中动态构建桶-每个唯一值一个。
希望对您有所帮助,谢谢。
以上是 使用Java API的ElasticSearch日期范围查询聚合 的全部内容, 来源链接: utcz.com/qa/434768.html