2013-03-27 17 views
13

Dlaczego nie widzę pola _timestamp, gdy możliwe jest filtrowanie zapytania przez niego?Zwracanie pola znacznika czasu w elastycznym wyszukującym

Następujące zapytanie zwraca poprawne dokumenty, ale nie sam znacznik czasu. Jak mogę zwrócić znacznik czasu?

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

Odwzorowanie jest:

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

wyjście próbki:

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

Odpowiedz

15

Kiedy pole znacznika czasu jest włączona, to indeksowane, ale nie są przechowywane domyślnie. Tak więc, podczas gdy możesz wyszukiwać i filtrować według pola znacznika czasu, nie możesz łatwo odzyskać go ze swoimi rekordami. Aby móc pobrać pola datownika, czego potrzeba, aby odtworzyć swój indeks z poniższego mapowania:

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

W ten sposób będzie można pobrać znacznik czasu jako liczbę milisekund od epoki.

+0

Dzięki. Jako sidenote, jeśli zaktualizuję moje mapowanie teraz na istniejącym indeksie, czy nowe rekordy będą miały znacznik czasu jako zapisany, a stare nie? czy stary zapis również zostanie zapisany? – eran

+10

Nie będzie można zaktualizować tego odwzorowania na istniejącym typie. Mapowanie _timestamp można ustawić tylko przy tworzeniu typu. – imotov

5

Nie jest konieczne zapisywanie pola sygnatury czasowej, ponieważ jego dokładna wartość jest zachowywana jako termin, który jest również bardziej prawdopodobny, że jest już obecny w pamięci RAM, zwłaszcza jeśli użytkownik pyta o to. można uzyskać dostęp za pomocą znacznika czasu jej trwania za pomocą script_value:

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

Uzyskana wartość jest wyrażona w milisekundach od czasu UNIX epoki. To dość nieprzyzwoite, że ElasticSearch nie może tego zrobić dla ciebie, ale hej, nic nie jest idealne.

+2

To jest świetne rozwiązanie, które działało, ale tylko po drobnych zmianach: 'script_fields' zamiast' script_values', a ponieważ 1.4.3 skrypty muszą żyć w plikach, zgodnie z [this] (http://www.elasticsearch.org/ guide/en/elasticsearch/reference/current/modules-scripting.html). – Juliano

+2

Nie działa w ogóle. Musiał zmienić 'script_values' na' script_fields' jak wspomniano powyżej i musiał zmienić '_doc ['timestamp']' na '_doc ['_ timestamp']'. Zwraca tylko poprawne wartości z typów z przechowywanym znacznikiem _timestamp, na innych zwraca po prostu 0 dla każdego dokumentu. – csauve

Powiązane problemy