elasticsearch ElasticSearch:在时间戳字段上按小时和分钟过滤数据,elasticsearch,kibana,elasticsearch,Kibana" /> elasticsearch ElasticSearch:在时间戳字段上按小时和分钟过滤数据,elasticsearch,kibana,elasticsearch,Kibana" />

elasticsearch ElasticSearch:在时间戳字段上按小时和分钟过滤数据

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": {

我已经创建了一个带有时间戳字段的索引,其中包含标准ISO格式YYYY-MM-DD HH:MM:SS+00:00的日期和时间数据。我需要过滤在给定日期的特定时间之间的数据。例如,我想筛选2019年1月所有日期上午6点到下午12:30之间收集的数据。我使用script标签按小时过滤,它可以正常工作。但我不知道如何在等式中增加分钟。下面是我的查询当前的样子

{
  "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"
                    }
                }
            }
        }
    }
}