簡體   English   中英

彈性搜索平均時差聚合查詢

[英]Elastic search Average time difference Aggregate Query

我在 elasticsearch 中有文檔,其中每個文檔如下所示:

{
  "id": "T12890ADSA12",
  "status": "ENDED",
  "type": "SAMPLE",
  "updatedAt": "2020-05-29T18:18:08.483Z",
  "events": [
    {
      "event": "STARTED",
      "version": 1,
      "timestamp": "2020-04-30T13:41:25.862Z"
    },
    {
      "event": "INPROGRESS",
      "version": 2,
      "timestamp": "2020-05-14T17:03:09.137Z"
    },
    {
      "event": "INPROGRESS",
      "version": 3,
      "timestamp": "2020-05-17T17:03:09.137Z"
    },
    {
      "event": "ENDED",
      "version": 4,
      "timestamp": "2020-05-29T18:18:08.483Z"
    }
  ],
  "createdAt": "2020-04-30T13:41:25.862Z"
}

現在,我想在 elasticsearch 中編寫一個查詢來獲取所有類型為“SAMPLE”的文檔,並且我可以獲得所有這些文檔的 STARTED 和 ENDED 之間的平均時間。 例如。 (2020-05-29T18:18:08.483Z - 2020-04-30T13:41:25.862Z, ....) 的平均值。 假設 STARTED 和 ENDED 事件在 events 數組中只出現一次。 有什么辦法可以做到嗎?

你可以做這樣的事情。 該查詢選擇 SAMPLE 類型和狀態為 ENDED 的事件(以確保存在 ENDED 事件)。 然后avg聚合使用腳本收集 STARTED 和 ENDED 時間戳並減去它們以返回天數:

POST test/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "status.keyword": "ENDED"
          }
        },
        {
          "term": {
            "type.keyword": "SAMPLE"
          }
        }
      ]
    }
  },
  "aggs": {
    "duration": {
      "avg": {
        "script": "Map findEvent(List events, String type) {return events.find(it -> it.event == type);} def started = Instant.parse(findEvent(params._source.events, 'STARTED').timestamp); def ended = Instant.parse(findEvent(params._source.events, 'ENDED').timestamp); return ChronoUnit.DAYS.between(started, ended);"
      }
    }
  }
}

腳本如下所示:

Map findEvent(List events, String type) {
  return events.find(it -> it.event == type);
}
def started = Instant.parse(findEvent(params._source.events, 'STARTED').timestamp);
def ended = Instant.parse(findEvent(params._source.events, 'ENDED').timestamp); 
return ChronoUnit.DAYS.between(started, ended);

暫無
暫無

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

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