首页 > 解决方案 > 计算两个日期字段之间差异的平均值

问题描述

我正在开发一个Elasticsearch用于存储数据并显示一些复杂统计数据的项目。

我有一个看起来像这样的索引:

Reservation {
  id: number
  check_in: Date
  check_out: Date
  created_at: Date
  // other fields...
}

我需要计算特定日期范围内我的 s之间的平均天数差异, check_in 并将结果显示为一个数字。 created_at Reservation

我试过这个query

{
  "script_fields": {
    "avgDates": {
      "script": {
        "lang": "expression",
        "source": "doc['created_at'].value - doc['check_in'].value"
      }
    }
  },
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "created_at": {
              "gte": "{{lastMountTimestamp}}",
              "lte": "{{currentTimestamp}}"
            }
          }
        }
      ]
    }
  },
  "size": 0,
  "aggs": {
    "avgBetweenDates": {
      "avg": {
        "field": "avgDates"
      }
    }
  }
}

日期字段ISO 8601格式保存(例如:2020-03-11T14:25:15+00:00),我不知道这是否会产生问题。

它捕获了一些点击,所以,查询肯定有效!但是,它总是null作为avgBetweenDates聚合的值返回。

我需要这样的结果:

"aggregations": {
    "avgBetweenDates": {
        "value": 3.14159 // Π is just an example!
    }
}

任何想法都会有所帮助!

谢谢你。

标签: elasticsearchelasticsearch-aggregationelasticsearch-dslelasticsearch-7

解决方案


_search在上下文中创建的脚本字段只能在该范围内使用。它们在aggregations! 这意味着您必须选择

  • 将您的脚本移动到该aggs部分并avg那里执行
  • 脚本化的度量聚合(相当缓慢且难以正确)
  • dateDifference或在索引时创建一个字段(最好int是时间戳的差异),这将使您能够执行强大的数字聚合,如扩展统计信息,提供统计上有用的输出,例如:
{
    ...

    "aggregations": {
        "grades_stats": {
           "count": 2,
           "min": 50.0,
           "max": 100.0,
           "avg": 75.0,
           "sum": 150.0,
           "sum_of_squares": 12500.0,
           "variance": 625.0,
           "std_deviation": 25.0,
           "std_deviation_bounds": {
            "upper": 125.0,
            "lower": 25.0
           }
        }
    }
}

并且总是比使用脚本计算时间戳差异更快。


推荐阅读