【问题标题】:ElasticSearch date range query aggregation using Java API使用 Java API 的 ElasticSearch 日期范围查询聚合
【发布时间】:2014-08-10 13:57:43
【问题描述】:

您好,我有一个 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。我想知道这些是否是更好的方法,因为我在循环中对所有日期组合执行上述查询。请先指导谢谢。

【问题讨论】:

  • 那么,您的日期是如何存储的?我的意思是它是 mm/dd/yy 还是时间,你如何找到日期是否唯一?
  • 您好,感谢您的回复。日期以 ISO 日期格式存储。每个文档可能有相似/重复的日期,所以我存储在 HashSet 中,然后一旦我有唯一的日期组合,我就会触发查询以获取每个日期的平均 cpu。

标签: java elasticsearch


【解决方案1】:

所以,我认为您可以拥有每天的数据, 您可以为此使用 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

基于多桶值源的聚合,其中桶位于 动态构建 - 每个唯一值一个。

希望这会有所帮助,谢谢。

【讨论】:

  • 非常感谢您的回答。因此,使用您的解决方案,我不需要为每个日期组合设置一个循环,这个查询将完成所有工作。我的日期格式看起来像 2014-07-25T10:25:00:000.Z 并且它可以以秒或毫秒差来组合。我必须找到所有这些组合的平均值才能为我做日期直方图。
  • 我认为它会起作用,这取决于您如何对日期进行分组或您如何认为独特。即,如果两个事件发生在 1 毫秒的间隔内,它会有所不同吗?如果是,那么您可以更改 interval =1 ,因此支持毫秒(必须测试)。只需更改间隔,支持每种时间格式。
  • 您好,效果非常好。只有一个查询给我排序的输出。我希望我能给你+10!
  • 谢谢也帮助了我:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 2018-01-09
  • 2019-04-06
  • 2020-06-23
相关资源
最近更新 更多