您好,我有一份关于 cpu 使用情况的文档,其中包含 date_time 字段。现在我想查找日期范围内的平均 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 聚合中的间隔以满足您的需要。
如果你想基于唯一性(也以毫秒为单位),那么你可以对日期使用术语聚合而不是日期直方图聚合。
A multi-bucket value source based aggregation where buckets are dynamically built - one per unique value.
希望对您有所帮助,谢谢。
关于java - 使用 Java API 的 ElasticSearch 日期范围查询聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25229315/