elasticsearch - 计算两个日期字段之间差异的平均值
问题描述
我正在开发一个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!
}
}
任何想法都会有所帮助!
谢谢你。
解决方案
_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
}
}
}
}
并且总是比使用脚本计算时间戳差异更快。
推荐阅读
- outlook - 如何区分邮箱消息的 Microsoft Graph API Deltaquery 中的存档和删除操作?
- android-external-storage - 在 Android 11 中 isExternalStorageManager() = true 之后的行为不一致
- sql - Snowflake - 一次运行多个 SQL 查询
- jquery - 下拉 JSON 数据获取
- python - 接收错误 JSON 中的意外令牌 N 在位置 34 使用流光显示地图
- javascript - 比较数组中的对象
- java - RecyclerView:没有附加适配器;跳过布局问题
- javascript - 当我尝试将数据作为数组获取时,json将数据显示为对象内部的数组
- python - 运行 tansorflow 项目时出现问题
- java - 任何实体的通用属性表