簡體   English   中英

在彈性搜索 date_histogram 聚合中將長時間戳表示為日期

[英]Representing a long timestamp as date in elastic search date_histogram 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
            }
        }
    }
}

嘗試在每天的文檔基礎上進行匯總。 運行正常,但是bucket輸出如下:

{
    "key_as_string": "yyyy-MM-dd1577836800000",
    "key": 1577836800000,
    "doc_count": 3
}

我的問題是:我怎么能渲染key_as_string要的東西,如2020-01-01不改變字段類型左右。

您可以使用無痛腳本語言來實現您想要的功能,但效率不高,因為無痛腳本在字段操作方面有很多開銷。 這是執行此操作的腳本方法

您可以設置格式並將長時期轉換為紀元的瞬間並按照您想要的方式對其進行格式化。 如前所述,這效率不高,但可以完成工作。

{
  "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 字段並使用日期數據類型,則您不必運行腳本並使用其復制到的字段進行聚合。

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
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM