目前,我已经知道如何从(时间戳)日期字段中过滤日期范围。这很简单:
length
但是如何根据gte:" 8:00:00"和lte:" 10:00:00"?这可能吗?
我的要求换句话说: 如何在本月(15-11-01 / 15-11-30)发生所有事件,但仅限于上午8:00至10:00之间?
答案 0 :(得分:17)
您可以使用range
过滤条件过滤正确的日期,然后使用script
过滤条件过滤所需的小时数,如下所示:
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"range": {
"date": {
"gte": "2015-11-01",
"lte": "2015-11-30"
}
}
},
{
"script": {
"script": "doc.date.date.getHourOfDay() >= min && doc.date.date.getHourOfDay() <= max",
"params": {
"min": 8,
"max": 10
}
}
}
]
}
}
}
}
}
请注意,您需要确保enable dynamic scripting才能使此查询生效。
答案 1 :(得分:3)
如果我正确地理解了你的问题,那么我认为你必须添加新的字段,其中只有时间像
一样PUT your_index
{
"mappings": {
"your_type": {
"properties": {
"time": {
"type": "date",
"format": "HH:mm:ss"
}
}
}
}
}
然后你可以像这样查询
{
"query": {
"bool": {
"must": [
{
"range": {
"date": {
"gte": "2015-11-01",
"lte": "2015-11-30"
}
}
},
{
"range": {
"time": {
"gte": "08:00:00",
"lte": "10:00:00"
}
}
}
]
}
}
}
这有帮助吗?
答案 2 :(得分:1)
以下是我曾经用过的只能从今天开始到下午6点的结果:
{
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "(log_message:\"My Search String\")"
}
},
{
"range": {
"@timestamp": {
"time_zone": "CET",
"gt": "now-24h/d",
"lte": "now-24h/d+18h"
}
}
}
]
}
}
}
重要的部分是“现在-24h / d”,它将围绕当天的午夜/开始,虽然它有点棘手,因为它取决于你是否使用gt / lt(e),见{{3}有关详细信息。