【问题标题】:How to show day names,using date-histogram aggregation in elascticsearch如何显示日期名称,在弹性搜索中使用日期直方图聚合
【发布时间】:2017-01-27 06:23:18
【问题描述】:

我一直在尝试在 elasticsearch 中使用日期直方图聚合,它以纪元或 yy-mm-dd-mm-ss 格式返回日期。但我想要的是获取每周的文件数量,比如星期一、星期二等。有什么办法可以做到这一点吗?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我可能遗漏了一些东西,但是,答案不是比 Vineeth 的答案简单吗?

    "aggregations": {
        "timeslice": {
            "histogram": {
                "script": "doc['timestamp'].date.getHourOfDay()",
                "interval": 1,
                "min_doc_count": 0,
                "extended_bounds": {
                    "min": 0,
                    "max": 23
                },
                "order": {
                    "_key": "desc"
                }
            }
        }
    

    这很好,因为它还包括结果为零的任何小时,并且它将结果扩展到整个 24 小时期间(由于 extended_bounds)。

    您可以使用 'getDayOfWeek'、'getHourOfDay'、...(有关更多信息,请参阅 'Joda time')。

    这对于几个小时来说非常有用,但对于几天/几个月,它会给你一个数字而不是月份名称。要解决此问题,您可以将时间段作为字符串获取 - 但是,这不适用于扩展边界方法,因此您可能会得到空结果(即 [Mon, Tues, Fri,太阳])。

    如果你想要的话,它就在这里:

    "aggregations": {
        "dayOfWeek": {
            "terms": {
                "script": "doc['timestamp'].date.dayOfWeek().getAsText()",
                "order": {
                    "_term": "asc"
                }
            }
        }
    

    即使这对您没有帮助,但希望其他人会发现它并从中受益。

    【讨论】:

    • 这对我有用,但我不得不为脚本使用这种格式:"script": "doc['timestamp'].date.dayOfWeek" 注意缺少括号。
    • 这很好用。 Elastic 6.6 用于获取一天中的小时的新语法是:doc['timestamp'].value.getHour()。 Elastic 已经知道timestamp 是一个日期,因此您可以使用.value 代替date 函数。
    【解决方案2】:

    您需要采用不同的方法。 使用脚本,您可以将日期时间转换为工作日。 如果您在此值上应用术语聚合,它应该可以正常工作。

    将日期时间值转换为工作日的脚本

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

    查询以获取值

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

    您还可以找到更多关于在聚合here 中使用脚本的示例。

    【讨论】:

      【解决方案3】:

      对于使用无痛的 ES5,这是可行的:

      "aggs": {
          "dayOfWeek": {
              "terms": {
                  "script": {
                      "inline": "doc['date_utc'].date.dayOfWeek",
                      "lang": "painless"
                  }
              }
          }
      }
      

      【讨论】:

      • 嗨,你能告诉我如何以文本格式获取星期几,例如星期一、星期二等。
      • joda.org/joda-time/key_format.html -> 包含例如的脚本"doc['timestamp'].date.toString('E')" 将输出 Mon, Tue, Wed ...
      • 您可以使用例如"Instant.ofEpochMilli(doc.timestamp.date.millis).atZone(ZoneId.of(params.tz)).format(DateTimeFormatter.ofPattern('e HH'))" 并传入来自docs.oracle.com/javase/9/docs/api/java/time/format/… 的任何模式(这为您提供时区支持...等)
      猜你喜欢
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 2020-07-27
      相关资源
      最近更新 更多