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

xti*_*ray 13 elasticsearch

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

"range": {
    "date": {
        "gte": "2015-11-01",
        "lte": "2015-11-30"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Val*_*Val 17

您可以使用range过滤器过滤正确的日期,然后使用script过滤器过滤所需的小时数,如下所示:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "range": {
                "date": {
                  "gte": "2015-11-01",
                  "lte": "2015-11-30"
                }
              }
            },
            {
              "script": {
                "script": {
                  "source": "doc.date.date.getHourOfDay() >= params.min && doc.date.date.getHourOfDay() <= params.max",
                  "params": {
                    "min": 8,
                    "max": 10
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您需要确保启用动态脚本以使此查询起作用.


Chi*_*h25 5

如果我正确理解你的问题,那么我认为你必须添加新字段,该字段仅索引时间,例如

PUT your_index
{
  "mappings": {
    "your_type": {
      "properties": {
        "time": {
          "type":   "date",
          "format": "HH:mm:ss"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样查询

{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "date": {
              "gte": "2015-11-01",
              "lte": "2015-11-30"
            }
          }
        },
        {
          "range": {
            "time": {
              "gte": "08:00:00",
              "lte": "10:00:00"
            }
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这有帮助吗?