2015-11-03 696 views
0

我正在尝试使用日期范围和时间范围为我的查询创建一个过滤器。就我而言,日期和时间是不同的字段。所以我想运行如下查询:向我展示本月发生的所有事件(15-10-01/15-10-30)10:00:00 am至12:00:00之间Elasticsearch:按日期和时间过滤为不同的字段

这是我的查询,但它不起作用。注意:如果我只使用“日期部分”它可以工作,但是与时间字段的组合,结果是错误的。

有什么建议吗?

{"query": { 
    "filtered": { 
     "query": { 
      "match": { "message" : "error" } 
     }, 
     "filter": { 
      "bool" : { 
       "must" : { 
        "range": { 
         "date": { 
          "gte": "15-11-01", 
          "lte": "15-11-30" 
         } 
        } 
       }, 
       "must" : { 
        "range": { 
         "time": { 
          "gte": "10:00:00", 
          "lte": "12:00:00" 
         } 
       } 
      } 
     } 
    } 
    } 
} 
} 

更新:运行命令:

curl -XGET localhost:9200/my_index/_mapping 

正如你们中的一些建议,我可以发现,ES是界定“时间”字段类型为字符串,而不是(日期)时间。 此外,正如它在第一个答案中指出的,我的查询语法是错误的。

+0

是否elasticsearch支持的时间格式,即它知道如何在一天中的时间内应用lte和gte吗? –

+0

你对'时间'有什么映射? –

+0

在logstash配置文件中,这些字段以这种方式映射:%{DATE:date}%{TIME:time} – xtingray

回答

0

有一点不正确的是,您在bool筛选器中有两个must子句。这不是有效的JSON,因此这可能是为什么您的查询不能正常工作,请尝试以下查询,而不是它有bool/must过滤器内的两个range过滤器的原因:

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match": { 
      "message": "error" 
     } 
     }, 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "range": { 
       "date": { 
        "gte": "15-11-01", 
        "lte": "15-11-30" 
       } 
       } 
      }, 
      { 
       "range": { 
       "time": { 
        "gte": "10:00:00", 
        "lte": "12:00:00" 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
+0

修复此查询有没有运气? – Val