2013-03-27 13 views
13

Perché non riesco a vedere il campo _timestamp mentre riesco a filtrare una query da esso?Restituire il campo timestamp in elasticsearch

La seguente query restituisce i documenti corretti, ma non il timestamp stesso. Come posso restituire il timestamp?

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

La mappatura è:

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

esempio di output:

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

risposta

15

Quando campo timestamp è attivato, è indicizzato, ma non memorizzato per impostazione predefinita. Quindi, mentre puoi cercare e filtrare per il campo data/ora, non puoi recuperarlo facilmente con i tuoi record. Al fine di essere in grado di recuperare il campo timestamp è necessario ricreare l'indice con il seguente mappatura:

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

In questo modo si sarà in grado di recuperare timestamp come il numero di millisecondi dal dell'epoca.

+0

Grazie. Come sidenote, se aggiorno la mia mappatura ora sull'indice esistente, i nuovi record avranno il timestamp come vecchi e non memorizzati? o sarà memorizzato anche il vecchio record? – eran

+10

Non sarà possibile aggiornare questo mapping su un tipo esistente. La mappatura _timestamp può essere impostata solo sulla creazione del tipo. – imotov

5

Non è necessario memorizzare il campo data/ora, poiché il suo valore esatto è conservato come un termine, che è anche più probabile che sia già presente nella RAM, specialmente se si sta effettuando una query su di esso. È possibile accedere al timestamp tramite il suo mandato con un script_value:

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

Il valore risultante è espresso in millisecondi dalla epoca UNIX. E 'abbastanza osceno che ElasticSearch non possa farlo per te, ma hey, niente è perfetto.

+2

Questa è una grande soluzione che ha funzionato, ma solo dopo piccole modifiche: 'script_fields' invece di' script_values' e dal momento che gli script 1.4.3 devono vivere in file, secondo [questo] (http://www.elasticsearch.org/ Guida/it/elasticsearch/riferimento/corrente/moduli-scripting.html). – Juliano

+2

Non funziona affatto. Dovevo cambiare 'script_values' in' script_fields' come menzionato sopra, e dovevo cambiare '_doc ['timestamp']' in '_doc ['_ timestamp']'. Restituisce solo i valori corretti dai tipi con il loro _timestamp memorizzato, in altri restituisce solo 0 per ciascun documento. – csauve

Problemi correlati