首页 文章

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

提问于
浏览
10

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

"range": {
    "date": {
        "gte": "2015-11-01",
        "lte": "2015-11-30"
    }
}

但是如果你对gte:“8:00:00”和lte:“10:00:00”等小时的范围感兴趣,如何过滤日期?这可能吗?

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

3 回答

  • 4

    如果我正确地理解了你的问题,那么我认为你必须添加新的字段,其中只有时间索引

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

    这有帮助吗?

  • 1

    您可以使用 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才能使此查询生效 .

  • 16

    以下是我曾经用过的只从今天开始到下午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"
                }
              }
            }
          ]
        }
      }
    }
    

    重要的部分是"now-24h/d",它将围绕当天的午夜/开始,虽然它有点棘手,因为它取决于你是否使用gt / lt(e),详见reference doc .

相关问题