elasticsearch:getMinuteOfDay()应用于日期范围过滤器中的time()

时间:2014-10-09 19:31:33

标签: elasticsearch

我正在尝试构建一个elasticsearch查询,以便在所有日期的午夜和当前时间之间返回文档。例如,如果我在09:00:00运行查询,那么无论日期如何,查询都将返回时间戳在午夜和09:00:00之间的任何文档。

以下是一个示例数据集:

curl -XPUT  localhost:9200/test/dt/_mapping -d '{"dt" : {"properties" : {"created_at" : {"type" : "date", "format": "YYYY-MM-DD HH:mm:ss" }}}}'

curl -XPOST localhost:9200/test/dt/1 -d '{ "created_at": "2014-10-09 07:00:00" }'
curl -XPOST localhost:9200/test/dt/2 -d '{ "created_at": "2014-10-09 14:00:00" }'
curl -XPOST localhost:9200/test/dt/3 -d '{ "created_at": "2014-10-08 08:00:00" }'
curl -XPOST localhost:9200/test/dt/4 -d '{ "created_at": "2014-10-08 15:00:00" }'
curl -XPOST localhost:9200/test/dt/5 -d '{ "created_at": "2014-10-07 09:00:00" }'
curl -XPOST localhost:9200/test/dt/6 -d '{ "created_at": "2014-10-07 16:00:00" }'

和示例过滤器:

curl -XPOST localhost:9200/test/dt/_search?pretty -d '{
  "query": {
    "filtered" : {
       "filter" : {
        "bool": {
          "must": [
            {
              "script" : {
            "script" : "doc[\"created_at\"].date.getMinuteOfDay() < 600"
              }
            }
          ]
        }
      }
    }
  }
}'

其中600是一个静态参数,我想用动态分钟参数替换,具体取决于查询运行的时间。

我最好的尝试是使用getMinuteOfDay()方法来过滤每个文档,但我的问题是如何获取当前时间的getMinuteOfDay()。我在上面的查询中尝试使用time()而不是硬编码参数600进行变换,但无法弄明白。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这已经很晚了,但可以使用DateTime.now()完成,您应该将查询更改为

GET test/dt/_search
{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "script": {
                "script": "doc[\"created_at\"].date.getMinuteOfDay() < DateTime.now().getMinuteOfDay()"
              }
            }
          ]
        }
      }
    }
  }
}

希望这有帮助!