Average of difference between the dates

我们两清 提交于 2021-02-08 11:29:43

问题


A snippet of my elasticsearch data is like below. Status field is nested.

status: [
                {
                  "updated_at": "2020-08-04 17:18:41",
                  "created_at": "2020-08-04 17:18:39",
                  "sub_stage": "Stage1"
                },
                {
                  "updated_at": "2020-08-04 17:21:15",
                  "created_at": "2020-08-04 17:18:41",
                  "sub_stage": "Stage2"
                },
                {
                  "updated_at": "2020-08-04 17:21:15",
                  "created_at": "2020-08-04 17:21:07",
                  "sub_stage": "Stage3"
                }
        ]

After aggregating based on some field, I have for each bucket some documents and every document will have status field. Now, what I want is to find the average of time difference between stage1 and stage3.

For ex: Suppose for id = 1 bucket consists of 100 documents. Then for each document I have to find the time difference between stage 1 and stage 3. Then, finally take the average of it.


I am able to perform till aggregation but stuck at finding average.

With some effort, I am using below script but have no idea whether it is correct :

Map findEvent(List events, String type) {
  return events.find(it -> it.sub_stage == type);
}
return ChronoUnit.DAYS.between(Instant.parse(findEvent(params._source.events, 'Stage1').timestamp), Instant.parse(findEvent(params._source.events, 'Stage3').timestamp););

Is there any way I can perform this in Java with this script or any other script ?


Roughly, Query looks like:

{
  "from": 0,
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "query": {
              "bool": {
                "should": [
                  {
                    "match": {
                      "status.sub_stage": {
                        "query": "Stage1",
                        "operator": "OR",
                        "prefix_length": 0,
                        "max_expansions": 50,
                        "fuzzy_transpositions": true,
                        "lenient": false,
                        "zero_terms_query": "NONE",
                        "auto_generate_synonyms_phrase_query": true,
                        "boost": 1.0
                      }
                    }
                  }
                ],
                "adjust_pure_negative": true,
                "minimum_should_match": "1",
                "boost": 1.0
              }
            },
            "path": "status",
            "ignore_unmapped": false,
            "score_mode": "none",
            "boost": 1.0
          }
        }
      ],
      "adjust_pure_negative": true,
      "minimum_should_match": "1",
      "boost": 1.0
    }
  },
  "aggregations": {
    "id": {
      "terms": {
        "field": "id.keyword",
        "size": 1000,
        "min_doc_count": 1,
        "shard_min_doc_count": 0,
        "show_term_doc_count_error": false,
        "order": [
          {
            "_count": "desc"
          },
          {
            "_key": "asc"
          }
        ]
      },
      "aggregations": {
        "avg time": {
          "avg": {
            "script": {
              "source": "Map findStage(List events, String type) { return events.find(it -> it.sub_stage == type); } return ChronoUnit.DAYS.between(Instant.parse(findStage(ctx._source.status, 'Stage1').timestamp), Instant.parse(findStage(ctx._source.status, 'Stage3').timestamp));",
              "lang": "painless"
            }
          }
        }
      }
    }
  }
}

来源:https://stackoverflow.com/questions/65630911/average-of-difference-between-the-dates

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!