2015-11-05 134 views
9

目前,我已经知道如何从(时间戳)日期字段过滤日期范围。这是一个容易:ElasticSearch:如何使用小时范围过滤器查询日期字段

"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:00到10:00:00之间?

+0

在这些小时之间,任何一天? –

+0

假设我想获得2015-10-01和2015-12-31之间的所有记录,但只有在这个小时范围内发生的记录:“8:00:00”和“10:00:00” – xtingray

+0

可能重复的[Elasticsearch:按日期和时间过滤不同的字段](http://stackoverflow.com/questions/33508044/elasticsearch-filtering-by-date-and-time-as-different-fields) – Val

回答

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

这是否帮助?

+0

现在,我的字段“date”有这样的类型:{“type”:“date”,“format”:“dateOptionalTime”},它支持像这样的2015-11-04T22:10:02这样的记录, t修改我的索引 – xtingray

+0

甚至在我的应用程序中,我有相同的格式,但事情是你只能像''gte“一样搜索:”2015-10-02T13:34:09“,”lte“:”2015-10-05T12 :00:00“'这会给你在该范围之间的结果,而不是你想要的,这是特定日期的特定时间范围 – ChintanShah25

15

您可以与您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为了为此查询工作。

+0

谢谢。它工作完美。顺便说一下,我试图添加另一个脚本来使用“getMinuteOfHour”方法过滤分钟,但它不起作用。任何建议? – xtingray

+0

你可以显示脚本吗? – Val

+0

嗨@Val你能告诉我getHourOfDay()方法来自哪里吗? groovy脚本引擎使用'joda'进行日期操作吗?我找不到任何文档 – ChintanShah25

0

这就是我曾经被用来只能从当天开始至下午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" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

的重要组成部分,是“现在已经24小时/ d”,这将轮至午夜/开始当日,虽然它有点棘手,因为它取决于您是否使用gt/lt(e),详情请参阅reference doc