簡體   English   中英

將時間戳轉換為日期時間以用於 Elasticsearch 聚合

[英]Convert timestamps to datetime for use in Elasticsearch aggregations

我有一個 SendGrid 事件數據的索引:

"_source": {
    "externalId": "9283cc1d-b003-xxxx-a5af-84fcf31c4181",
    "email": "test@test.com",
    "timestamp": 1616515214,
    "event": "processed",
    "uid": null,
    "id": null,
    "sendgridEventId": null,
    "smtpId": null,
    "sgMessageId": null,
    "sgEventId": null,
    "sendgridEvent": null,
    "type": null,
    "category": [],
    "reason": null,
    "status": null,
    "url": null,
    "useragent": null,
    "ip": null,
    "response": null,
    "tls": null,
    "attempt": null,
    "sendAt": null,
    "asmGroupId": null
}

現在,我喜歡使用timestamp屬性匯總給定日期的所有這些事件。

GET /sendgridevententity/_search
{
  "query":
   {
    "match_all": {}
   },
   "aggs": {
     "amount_per_day": {
       "date_histogram": {
         "field": "timestamp",
         "calendar_interval": "1d"
       }
     }
   }
}  

不幸的是,這只會產生所有單個事件,因為它們都有不同的時間戳,並且聚合不會按天對它們進行分組。

如何將時間戳轉換為date然后運行聚合?

您可以利用多字段映射 這是它的工作原理。

  1. 使用新的日期“子字段”更新現有映射。 我假設timestamp最初被映射為long 我還假設時間戳以紀元秒為單位,因此明確設置了format
POST sendgridevententity/_mapping
{
  "properties": {
    "timestamp": {
      "type": "long",
      "fields": {
        "as_date": {
          "type": "date",
          "format": "epoch_second"
        }
      }
    }
  }
}
  1. 現在需要選擇這個新屬性,並且需要重新索引您的數據。 你可以通過一個很酷的小技巧來觸發重新索引調用——發送一個空的_update_by_query請求:
POST sendgridevententity/_update_by_query
  1. 重新索引操作完成后,您可以通過點表示法定位新的日期字段:
GET /sendgridevententity/_search
{
  "size": 0, 
  "query": {
    "match_all": {}
  },
  "aggs": {
    "amount_per_day": {
      "date_histogram": {
        "field": "timestamp.as_date",
        "format": "yyyy-MM-dd", 
        "calendar_interval": "1d"
      }
    }
  }
}

⚠️ 根據您的索引大小和許多其他因素, _update_by_query請求可能會出現超時。 可以設置wait_for_completion=false這將觸發異步后台任務。

請注意,我在最終請求中使用了size: 0 這是一個只返回聚合結果的方便工具。

暫無
暫無

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

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