2015-11-03 705 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