elasticsearch ElasticSearch:在时间戳字段上按小时和分钟过滤数据
我已经创建了一个带有时间戳字段的索引,其中包含标准ISO格式YYYY-MM-DD HH:MM:SS+00:00的日期和时间数据。我需要过滤在给定日期的特定时间之间的数据。例如,我想筛选2019年1月所有日期上午6点到下午12:30之间收集的数据。我使用script标签按小时过滤,它可以正常工作。但我不知道如何在等式中增加分钟。下面是我的查询当前的样子elasticsearch ElasticSearch:在时间戳字段上按小时和分钟过滤数据,elasticsearch,kibana,elasticsearch,Kibana,我已经创建了一个带有时间戳字段的索引,其中包含标准ISO格式YYYY-MM-DD HH:MM:SS+00:00的日期和时间数据。我需要过滤在给定日期的特定时间之间的数据。例如,我想筛选2019年1月所有日期上午6点到下午12:30之间收集的数据。我使用script标签按小时过滤,它可以正常工作。但我不知道如何在等式中增加分钟。下面是我的查询当前的样子 { "query": { "bool": { "filter": { "bool": {
{
"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
}
"""
}
}
}
]
}
}
}
}
}
请注意,从边界中减去或添加毫秒需要minusNanos和plusNanos-LocalTime的isBefore和相关isAfter方法不包括在内。这也将允许您轻松调整下限时间。我需要在Kibana中根据时间戳的小时数进行同样的过滤,但James的脚本对我不起作用,我需要对其进行一些调整,语法为doc['fieldname'].date.hourOfDay,因此这里有一个对我起作用的版本:
{
"query": {
"bool": {
"must": {
"script": {
"script": {
"params": {
"lowerBoundHour": 6,
"upperBoundHour": 20
},
"source": "doc['@timestamp'].date.hourOfDay >= params.lowerBoundHour && doc['@timestamp'].date.hourOfDay <= params.upperBoundHour",
"lang": "painless"
}
}
}
}
}
}
如果您可以将日期和时间存储在单独的字段中,查询将更加高效。这个答案可能会有所帮助:@NishantSaini您的意思是创建一个只包含时间的新字段?但是数据已经索引,添加新索引可能不可行。谢谢。非常有用。我还需要通过多个时隙进行额外过滤,我可以使用您提供的相同格式进行过滤。谢谢你指出这些方法。
{
"query": {
"bool": {
"must": {
"script": {
"script": {
"params": {
"lowerBoundHour": 6,
"upperBoundHour": 20
},
"source": "doc['@timestamp'].date.hourOfDay >= params.lowerBoundHour && doc['@timestamp'].date.hourOfDay <= params.upperBoundHour",
"lang": "painless"
}
}
}
}
}
}