【问题标题】:Elasticsearch - group by day of week and hourElasticsearch - 按星期几和小时分组
【发布时间】:2015-08-06 17:29:10
【问题描述】:

我需要获取一些按星期几和小时分组的数据,例如

curl -XGET http://localhost:9200/testing/hello/_search?pretty=true -d '
{
        "size": 0,
        "aggs": {
          "articles_over_time" : {
            "date_histogram" : {
                "field" : "date",
                "interval" : "hour",
                "format": "E - k"
            }
          }
        }
}
'

给我这个:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 2857,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "articles_over_time" : {
      "buckets" : [ {
        "key_as_string" : "Fri - 17",
        "key" : 1391792400000,
        "doc_count" : 6
      },
     ...
      {
        "key_as_string" : "Wed - 22",
        "key" : 1411596000000,
        "doc_count" : 1
      }, {
        "key_as_string" : "Wed - 22",
        "key" : 1411632000000,
        "doc_count" : 1
      } ]
    }
  }
}

现在我需要按“Wed - 22”这个值来汇总文档计数,我该怎么做? 也许是另一种方法?

【问题讨论】:

    标签: elasticsearch aggregation


    【解决方案1】:

    this thread已经解决了同样的问题。

    根据您的问题调整解决方案,我们需要制作一个脚本来将日期转换为一天中的小时和一周中的一天:

    Date date = new Date(doc['date'].value) ; 
    java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE, HH');
    format.format(date)
    

    并在查询中使用它:

    {
        "aggs": {
            "perWeekDay": {
                "terms": {
                    "script": "Date date = new Date(doc['date'].value) ;java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE, HH');format.format(date)"
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用子聚合从聚合结果中对“key_as_string”字段进行术语聚合。

      希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        这是因为您使用的是“小时”间隔,但是日期格式是“日”(E - k)。

        将您的时间间隔更改为“天”,您将不再获得“Weds - 22”的单独存储桶。

        或者,如果您确实需要每小时,请更改格式以包含小时字段。

        【讨论】:

        • 非脚本解决方案的一个缺点是,如果查询跨越多天,您每小时会获得多个值,我目前的解决方案是在客户端将其组合起来,因为我想避免为此打开脚本。
        • 不确定我是否遵循您的评论 :-)。间隔和格式是相关的——间隔控制分桶,格式控制桶的名称。如果您希望存储桶名称都是唯一的,则必须适当地设置格式。 ?!或者,忽略“key_as_string”并改用“key”;-)。
        • 我的目标是在较长时间内获得“一天中的小时”直方图。它应该显示在凌晨 1 点、凌晨 2 点、凌晨 3 点发生了多少事情。现在,如果我设置间隔:“小时”和格式:“HH”,我会得到预期的小时桶,key_as_string“01”,“02”,...,但是它们每天都重复,所以我得到多个“01 ", 和多个 "02", ...
        • 好的,所以,如果您想将所有凌晨 2 点(跨越多天)合并到同一个存储桶中,那么您可以从我的其他答案中得到 ;-) - stackoverflow.com/questions/29002152/…
        • 啊,好的。我明白。两者都不是惊人的,但至少你的方法降低了查询的成本。祝你好运:-)。
        猜你喜欢
        • 2015-05-13
        • 2022-08-10
        • 1970-01-01
        • 2020-06-01
        • 2011-10-31
        • 1970-01-01
        • 2018-08-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多