2013-03-27 5 views
13

Warum kann ich das Feld _timestamp nicht sehen, während ich eine Abfrage filtern kann?Zurückgeben des Zeitstempelfelds in elasticsearch

Die folgende Abfrage gibt die richtigen Dokumente, aber nicht den Zeitstempel selbst zurück. Wie kann ich den Zeitstempel zurückgeben?

{ 
    "fields": [ 
    "_timestamp", 
    "_source" 
    ], 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "range": { 
      "_timestamp": { 
      "from": "2013-01-01" 
      } 
     } 
     } 
    } 
    } 
} 

Die Abbildung ist:

{ 
    "my_doctype": { 
     "_timestamp": { 
      "enabled": "true" 
     }, 
     "properties": { 
      "cards": { 
       "type": "integer" 
      } 
     } 
    } 
} 

Beispielausgabe:

{ 
    "took" : 1, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 1, 
    "successful" : 1, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 2, 
    "max_score" : 1.0, 
    "hits" : [ { 
     "_index" : "test1", 
     "_type" : "doctype1", 
     "_id" : "HjfryYQEQL6RkEX3VOiBHQ", 
     "_score" : 1.0, "_source" : {"cards": "5"} 
    }, { 
     "_index" : "test1", 
     "_type" : "doctype1", 
     "_id" : "sDyHcT1BTMatjmUS0NSoEg", 
     "_score" : 1.0, "_source" : {"cards": "2"} 
    }] 
    } 

Antwort

15

Wenn Zeitstempel-Feld aktiviert ist, wird es indiziert, aber nicht standardmäßig gespeichert. Während Sie nach dem Zeitstempelfeld suchen und filtern können, können Sie es nicht einfach mit Ihren Datensätzen abrufen. Um in der Lage sein, den Zeitstempel-Feld abrufen müssen Sie Ihren Index mit der folgenden Abbildung erstellen:

{ 
    "my_doctype": { 
     "_timestamp": { 
      "enabled": "true", 
      "store": "yes" 
     }, 
     "properties": { 
      ... 
     } 
    } 
} 

Auf diese Weise können Sie Zeitstempel als die Anzahl von Millisekunden seit Beginn der Epoche abzurufen.

+0

Danke. Als Nebenbemerkung, wenn ich meine Mapping jetzt auf den vorhandenen Index aktualisieren, haben neue Datensätze den Zeitstempel als gespeichert und nicht alt? oder wird alte Aufzeichnung gespeichert? – eran

+10

Sie können diese Zuordnung für einen vorhandenen Typ nicht aktualisieren. Die _timestamp-Zuordnung kann nur bei der Typerstellung festgelegt werden. – imotov

5

Es ist nicht notwendig, das Zeitstempelfeld zu speichern, da sein genauer Wert als Ausdruck erhalten bleibt, der wahrscheinlich auch schon im RAM vorhanden ist, besonders wenn Sie ihn abfragen. Sie können den Zeitstempel über die Laufzeit Zugriff auf eine script_value mit:

{ 
    "query": { 
     ... 
    }, 
    "script_fields": { 
     "timestamp": { 
      "script": "_doc['_timestamp'].value" 
     } 
    } 
} 

Der resultierende Wert wird in Millisekunden seit dem UNIX-Epoche zum Ausdruck gebracht. Es ist ziemlich obszön, dass ElasticSearch das nicht für dich tun kann, aber hey, nichts ist perfekt.

+2

Dies ist eine großartige Lösung, die funktioniert, aber nur nach geringfügigen Änderungen: 'script_fields' anstelle von' script_values' und da 1.4.3 Skripte in Dateien leben müssen, nach [this] (http://www.elasticsearch.org/ guide/de/elasticsearch/reference/current/modules-scripting.html). – Juliano

+2

Funktioniert überhaupt nicht. Er musste 'script_values' in' script_fields' ändern, wie oben erwähnt, und musste '_doc ['timestamp']' in '_doc ['_ timestamp']' ändern. Gibt nur korrekte Werte von Typen zurück, deren _timestamp gespeichert ist, bei anderen gibt es nur 0 für jedes Dokument zurück. – csauve

Verwandte Themen