java - 使用 Java API 的 ElasticSearch 日期范围查询聚合

标签 java elasticsearch

您好,我有一份关于 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 聚合中的间隔以满足您的需要。

如果你想基于唯一性(也以毫秒为单位),那么你可以对日期使用术语聚合而不是日期直方图聚合。

Terms Aggregation

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/

相关文章:

java - 如何在我的 MainActivity 中获取 EditTextPreference 的引用?

java - 无法从 9.0.1 intellij (windows) 确定 java 版本

java - Elasticsearch默认不考虑字符串字段并且不给出正确的匹配结果

java - Eclipse Juno 中外部配置文件的 Checkstyle

java - 什么是 java 字节码性能 getfield vs invokevirtual

java - 链表中的头节点

c# - 通过 NEST 检查 ElasticSearch 中是否存在类型

database - elasticsearch如何使用精确搜索并忽略关键字中的关键字特殊字符?

python - 为什么 “sort”出现在elasticsearch的这个JSON中?

elasticsearch - 是否可以使用 Elasticsearch 搜索动态(网页)内容?