2013-03-20 70 views
0

我在努力理解_timestamp以及如何正確使用它。我正在存儲日誌數據,因此時間戳非常重要。我想能夠存儲時間戳並按範圍查詢它。每當我使用_timestamp這個名稱的字段時,當我查詢它時,我都無法得到任何結果。無論是使用ISO 8601文本格式還是以毫秒爲單位進行存儲和查詢,都會發生這種情況。有沒有人有這個工作的完整例子?索引和範圍查詢_timestamp數據

使用文本格式(FWIW,這是單元測試代碼作爲本地節點運行)時的測試代碼。

client.admin().indices().create(new CreateIndexRequest(indexName).mapping("log", 
      "{\"_timestamp\": {\"enabled\": true, \"store\": \"yes\"}}")); 
client.prepareIndex(indexName, "log", auditEvent.getId().toString()) 
     .setSource(jsonBuilder() 
       .startObject(). 
       field("eventType", auditEvent.getEventType().toString()). 
       field("_timestamp", auditEvent.getEventTime().toString(ISODateTimeFormat.dateTime())). 
       field("userId", auditEvent.getUserId()). 
       endObject()) 
       .execute() 
       .actionGet(); 

SearchResponse response = client.prepareSearch(indexNames.toArray(new String[] {})).setTypes("log") 
      .setQuery(
        QueryBuilders. 
        boolQuery() 
        .must(QueryBuilders.fieldQuery("eventType", eventType)) 
        .must(QueryBuilders.rangeQuery("_timestamp") 
          .from(interval.getStart().toString()) 
          .to(interval.getEnd().toString()) 
          ) 
        ) 
        .addField("_timestamp") 
        .execute().actionGet(); 

當我使用匹配完成相同的查詢時,我可以看到timestamp字段。

"hits" : { 
    "total" : 2, 
    "max_score" : 1.0, 
    "hits" : [ { 
    "_index" : "audit-events-2013-03-04", 
    "_type" : "log", 
    "_id" : "3d584830-8506-11e2-8365-24be05270b5c", 
    "_score" : 1.0, 
    "fields" : { 
     "_timestamp" : "2013-03-04T20:01:02.003Z" 
    } 
    }, { 
    "_index" : "audit-events-2013-03-04", 
    "_type" : "log", 
    "_id" : "e6e382e0-84f5-11e2-8365-24be05270b5c", 
    "_score" : 1.0, 
    "fields" : { 
     "_timestamp" : "2013-03-04T18:04:05.006Z" 
    } 
    } ] 

我不理解什麼?

回答

0

答案是時間戳需要使用IndexRequest的時間戳方法顯式設置。僅僅在名爲_timestamp的字段上設置它不起作用。

IndexRequestBuilder indexRequestBuilder = client.prepareIndex(indexName, "type1", auditEvent.getId().toString()) 
       .setSource(jsonBuilder() 
         .startObject(). 
         field("eventType", auditEvent.getEventType().toString()). 
         auditEvent.getEventTime().toString(ISODateTimeFormat.dateTime())). 
         field("userId", auditEvent.getUserId()).       endObject()).setTimestamp(Long.toString(auditEvent.getEventTime().getMillis())); 
indexRequestBuilder 
     .execute() 
     .actionGet();