2013-03-27 23 views
13

Bir sorguyu filtreleyebilirken neden _timestamp alanını göremiyorum?Elasticsearch'teki zaman damgası alanının döndürülmesi

Aşağıdaki sorgu, doğru belgeleri döndürür, ancak zaman damgasının kendisini döndürmez. Zaman damgasını nasıl iade edebilirim?

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

haritalama geçerli:

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

örnek çıktı:

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

cevap

15

damgası alanı etkinleştirildiğinde, bu endeksli ancak varsayılan olarak saklanmaz. Bu nedenle, zaman damgası alanına göre arama yapabilir ve filtreleyebilirsiniz, ancak kayıtlarınızla kolayca geri alamazsınız. Eğer Dönemden beri milisaniye sayısı olarak zaman damgası almak mümkün olacak

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

Bu şekilde: Amacıyla aşağıdaki haritalama ile endeksinizi yeniden oluşturmanız gerekir zaman damgası alanı almak mümkün.

+0

Teşekkürler. Bir sidenote olarak, eşleştirmeyi şimdiki dizinde güncellerseniz, yeni kayıtlar zaman damgasını saklanır ve eski değil mi? ya da eski kayıt da saklanacak mı? – eran

+10

Bu eşleştirmeyi varolan bir türde güncelleyemezsiniz. _timestamp eşlemesi sadece tür oluşturma üzerinde ayarlanabilir. – imotov

5

Zaman damgası alanını depolamak gerekli değildir, çünkü tam değeri bir terim olarak korunur, bu da özellikle RAM üzerinde mevcut olma olasılığı yüksektir, özellikle de üzerinde sorgu yapıyorsanız. Bir script_value kullanarak terim aracılığıyla damgası erişebilirsiniz:

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

çıkan değer UNIX Dönemden beri milisaniye cinsinden ifade edilir. ElasticSearch'in bunu senin için yapamayacağı oldukça belirsiz, ama hey, hiçbir şey mükemmel değil.

+2

Bu işe yarayan harika bir çözümdür, ancak sadece küçük değişiklikler yapıldıktan sonra: 'script_fues' yerine' script_values' ve 1.4.3 betiklerinin dosyalarda olması gerekir, çünkü [this] 'e göre (http://www.elasticsearch.org/)/tr/elasticsearch/başvuru// akım modülleri-scripting.html yönlendirir. – Juliano

+2

Hiç çalışmıyor. 'Script_values' komutunu yukarıda belirtilen 'script_fields' olarak değiştirmeliydim ve '_doc [' timestamp '] '' i' dd ['_ timestamp'] 'olarak değiştirmek zorunda kaldı. Yalnızca, _timestamp saklanan tiplerden doğru değerleri döndürür, diğerlerinde her belge için sadece 0 değerini döndürür. – csauve