elasticsearch - 在 Elasticsearch date_histogram聚合中将长时间戳表示为日期

标签 elasticsearch elasticsearch-aggregation

我有一个索引,其中的ts字段代表时期ms:

"ts": {
    "type": "long"
}

请注意,该类型是long,而不是epoch_millis日期类型。

我在该字段上运行日期直方图聚合:
{
    ...
    "aggs": {
       "agg_name": {
            "date_histogram": {
                "field": "ts",
                "interval": "1d",
                "format": "yyyy-MM-dd",
                "min_doc_count": 1
            }
        }
    }
}

尝试汇总每天的文档。
该操作运行正常,但是存储桶输出如下:
{
    "key_as_string": "yyyy-MM-dd1577836800000",
    "key": 1577836800000,
    "doc_count": 3
}

我的问题是:如何在不更改字段类型的情况下将key_as_string呈现为诸如2020-01-01之类的东西。

最佳答案

您可以使用painless scripting language来实现所需的功能,但效率不高,因为无痛脚本在字段操作中会产生大量开销。这是执行此操作的脚本方法

您可以设置格式,并将long转换为新纪元,然后以所需的方式对其进行格式化。如前所述,这效率不高,但可以完成工作。

{
  "aggs": {
    "dt_terms": {
      "terms": {
        "script": {
          "source": """
           DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault());
           return df.format(Instant.ofEpochMilli(doc['ts'].value));
""",
          "lang": "painless"
        }
      }
    }
  }
}

由于您不想修改原始字段的数据类型,因此可以实现的另一种方法是使用copy_to字段。在映射中,如果您添加如下所示的新的copy_to字段并使用date数据类型,则不必运行脚本并使用将其复制到的字段进行汇总。
PUT /index_name/_mapping
{
  "properties": {
    "ts": {
      "type": "long",
      "copy_to": "ts_d"
    },
    "ts_d": {
      "type": "date"
    }
  }
}

如果您具有上述映射,则可以使用reindex API来为新映射建立索引,然后使用下面的查询,该查询现在可用于日期数据类型。
GET /_search
{
  "aggs": {
       "agg_name": {
            "date_histogram": {
                "field": "ts_d",
                "interval": "1d",
                "format": "yyyy-MM-dd",
                "min_doc_count": 1
            }
        }
    }
}

关于elasticsearch - 在 Elasticsearch date_histogram聚合中将长时间戳表示为日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60550208/

相关文章:

elasticsearch - 如何在Elasticsearch中聚合结果?

elasticsearch - 如何为 elasticsearch-dsl 使用复合聚合

elasticsearch - 如何使用NGram过滤器自动完成对多值字段的Elasticsearch术语聚合?

elasticsearch - 未使用Logstash模板的设置创建Elasticsearch索引

elasticsearch - 通过高级Rest API创建Elasticsearch索引失败?

ruby-on-rails - searchkick代理设置ruby on rails

elasticsearch - 列表字段上针对自身的重要术语聚合

elasticsearch - elasticsearch nest 7.1聚合字段通用速记字段表达式

elasticsearch - 未指定排序选项且未指定搜索查询时, Elasticsearch 如何排序

elasticsearch - 如何按特定值搜索或Elasticsearch中不存在字段的地方