ElasticSearch:如何使用小时范围过滤器查询日期字段

时间:2015-11-05 01:20:07

标签: elasticsearch

目前,我已经知道如何从(时间戳)日期字段中过滤日期范围。这很简单:

length

但是如何根据gte:" 8:00:00"和lte:" 10:00:00"?这可能吗?

我的要求换句话说: 如何在本月(15-11-01 / 15-11-30)发生所有事件,但仅限于上午8:00至10:00之间?

3 个答案:

答案 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}有关详细信息。