使用Java API进行ElasticSearch日期范围查询聚合

Ume*_*cha 1 java 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()
Run Code Online (Sandbox Code Playgroud)

现在,上面的查询将我作为预期文档返回到日期范围内.现在我尝试做的是我从这些文档中找到所有独特的日期,SearchHits并且我将这个独特的日期组合存储在a中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()
Run Code Online (Sandbox Code Playgroud)

现在上面的查询工作正常并给出输出我获得每个日期时间组合的平均CPU.我想知道这些是否是更好的方法,因为我在所有日期组合的循环中执行上面的查询.请提前指导谢谢.

pro*_*mer 8

所以,我认为你可以每天获得数据,你可以使用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();
Run Code Online (Sandbox Code Playgroud)

您可以更改dateHistogram聚合中的间隔以满足您的需要.

如果您希望基于唯一(也以毫秒为单位),则可以使用术语聚合作为日期而不是日期直方图聚合.

术语聚合

基于多桶值的聚合,其中动态构建存储桶 - 每个唯一值一个存储桶.

希望这有帮助,谢谢.