gpt4 book ai didi

Elasticsearch : Filter data by hour and minute on a timestamp field

转载 作者:行者123 更新时间:2023-12-02 22:55:38 24 4
gpt4 key购买 nike

我创建了一个带有“TimeStamp”字段的索引,其中包含标准 ISO 格式“YYYY-MM-DD HH:MM:SS+00:00”的日期和时间数据。我需要过滤特定日期特定时间之间的数据。例如,我想过滤 2019 年 1 月所有日子上午 6 点到下午 12:30 之间收集的数据。我使用脚本标签按小时进行过滤,效果很好。但我无法弄清楚如何在等式中添加分钟。这是我的查询当前的样子

{
"query": {
"bool": {
"filter": {
"bool": {
"must": [
{
"range": {
"TimeStamp": {
"gte": "2019-01-01T00:00:00.000Z",
"lte": "2019-01-31T23:59:59.000Z"
}
}
},
{
"script": {
"script": {
"source": "(doc['TimeStamp'].value.getHour() >= 6 && doc['TimeStamp'].value.getHour() <= 22)"
}
}
}
]
}
}
}
}
}

这为我提供了特定时间的数据,但如何添加分钟数?添加 getMinute() 实际上是单独应用它并过滤掉相关结果。有人可以指导我吗?

最佳答案

您走在正确的轨道上 - 正如您所指出的, getMinute 方法适用于所有情况。但是,使用这种剥离小时和分钟字段的方法,仅当小时处于上限时,您才需要添加一组附加条件。请注意,如果您还想为下限设置一个可调整的分钟,则需要额外的条件,但这应该可以帮助您开始:

{
"query": {
"bool": {
"filter": {
"bool": {
"must": [
{
"range": {
"TimeStamp": {
"gte": "2019-01-01T00:00:00.000Z",
"lte": "2019-01-31T23:59:59.000Z"
}
}
},
{
"script": {
"script": {
"params": {
"lowerBoundHour": 6,
"upperBoundHour": 12,
"upperBoundMin": 30
},
"source": """
if (doc['TimeStamp'].value.getHour() >= params.lowerBoundHour && doc['TimeStamp'].value.getHour() <= params.upperBoundHour) {
if (doc['TimeStamp'].value.getHour() == params.upperBoundHour) {
if (doc['TimeStamp'].value.getMinute() <= params.upperBoundMin) {
return true
} else {
return false
}
} else {
return true
}
} else {
return false
}
"""
}
}
}
]
}
}
}
}
}

由于这看起来有点复杂,并且可能不是性能最好的,因此我建议您还考虑一下使用 LocalTime 方法来转换 TimeStamp 字段,因为很可能可以使用更简单的条件将其写得更干净。

更新:

我认为这个版本看起来更干净一些:

{
"query": {
"bool": {
"filter": {
"bool": {
"must": [
{
"range": {
"TimeStamp": {
"gte": "2019-01-01T00:00:00.000Z",
"lte": "2019-01-31T23:59:59.000Z"
}
}
},
{
"script": {
"script": {
"params": {
"lowerBoundHour": 6,
"lowerBoundMin": 0,
"upperBoundHour": 12,
"upperBoundMin": 30
},
"source": """
def formattedTime = LocalTime.of(doc['TimeStamp'].value.getHour(), doc['TimeStamp'].value.getMinute());
def lowerBound = LocalTime.of(params.lowerBoundHour, params.lowerBoundMin).minusNanos(1000000);
def upperBound = LocalTime.of(params.upperBoundHour, params.upperBoundMin).plusNanos(1000000);

if (lowerBound.isBefore(formattedTime) && formattedTime.isBefore(upperBound)) {
return true;
} else {
return false;
}
"""
}
}
}
]
}
}
}
}
}

请注意,minusNanosplusNanos 是从边界中减去或添加毫秒所必需的 - isBefore(以及相关的 isAfter ) LocalTime 的方法不包含在内。这还允许您轻松调整下限时间。

关于 Elasticsearch : Filter data by hour and minute on a timestamp field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55570559/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com