2015-03-11 3 views
0

Я пытаюсь сохранить миллисекунды с UNIX EPOCH в поле даты в elasticsearch. Это должно быть возможно, как указано в онлайн-руководстве:Агрегация по дате, где значение даты хранилось в миллисекундах

Тип даты также будет принимать длинное число, обозначающее UTC миллисекунды с эпохи, независимо от формата, который он может обрабатывать. http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-core-types.html:

Причина этого заключается в том, что у меня есть набор файлов, для которых версия является также отметка, что они были созданы. Поэтому я определил следующий индекс и отображение (пример):

curl -XPUT 'http://localhost:9200/datastore'` 

curl -XPUT 'http://localhost:9200/datastore/_mapping/files' -d ' 
{ 
    "files" : { 
     "properties" : { 
      "version" : { 
       "type" : "date" 
      } 
     } 
    } 
}' 

После хранения миллисекунд следующим образом:

curl -XPOST 'http://localhost:9200/datastore/files' -d '{ 
    "version": "0" 
}' 

я получить поле с нормальным запросом, он возвращается в порядке:

curl -XGET "http://127.0.0.1:9200/datastore/_search?pretty" -d '{ 
    "fields" : ["version"] 
}' 

Ответ:

{ 
    "took" : 3, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 1, 
    "max_score" : 1.0, 
    "hits" : [ { 
     "_index" : "datastore", 
     "_type" : "files", 
     "_id" : "AUwHnaoalv87gaUunUaf", 
     "_score" : 1.0, 
     "fields" : { 
     "version" : [ "0" ] 
     } 
    } ] 
    } 
} 

Однако, когда я пытаюсь объединить на поле, значение теперь вдруг интерпретируется как миллисекунды от года 0. другого значения возвращается в качестве ключа для каждого из бункеров:

curl -XGET "http://localhost:9200/datastore/_search?pretty" -d '{ 
    "aggs": { 
     "uniqueVersions": { 
      "terms": { 
       "field": "version" 
      } 
     } 
    } 
}' 

Ответ:

{ 
    "took" : 93, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 1, 
    "max_score" : 1.0, 
    "hits" : [ { 
     "_index" : "datastore", 
     "_type" : "files", 
     "_id" : "AUwHnaoalv87gaUunUaf", 
     "_score" : 1.0, 
     "_source":{ 
    "version": "0" 
} 
    } ] 
    }, 
    "aggregations" : { 
    "uniqueVersions" : { 
     "doc_count_error_upper_bound" : 0, 
     "sum_other_doc_count" : 0, 
     "buckets" : [ { 
     "key" : -62167219200000, 
     "key_as_string" : "0000-01-01T00:00:00.000Z", 
     "doc_count" : 1 
     } ] 
    } 
    } 
} 

Как вы видите, ключ теперь является фактическим нулем года. Я хотел бы знать, почему это так, так как я ожидал «0» в качестве ключа ведра.

ответ

0

Похоже, проблема была связана со строкой JSON во время индексации. Я индексировать его следующим образом:

curl -XPOST 'http://localhost:9200/datastore/files' -d '{ 
    "version": "0" 
}' 

, где он должен был

curl -XPOST 'http://localhost:9200/datastore/files' -d '{ 
    "version": 0 
}' 

Похоже миллисекунд будет увидеть только в миллисекундах, если значение JSON является актуальной долго. В противном случае используется стандартный формат даты даты и нуль интерпретируется как нулевой год.