Форматирование даты в запросе elasticsearch (во время извлечения)
У меня есть индекс elasticsearch с полем "aDate" (и множеством других полей) со следующим отображением
"aDate" : {
"type" : "date",
"format" : "date_optional_time"
}
Когда я запрашиваю документ, я получаю результат, подобный
"aDate" : 1421179734000,
Я знаю, что это эпоха, внутренний формат даты java/elasticsearch, но я хочу, чтобы результат был таким:
"aDate" : "2015-01-13T20:08:54",
Я играю со сценариями
{
"query":{
"match_all":{
}
},
"script_fields":{
"aDate":{
"script":"if (!_source.aDate?.equals('null')) new java.text.SimpleDateFormat('yyyy-MM-dd\'T\'HH:mm:ss').format(new java.util.Date(_source.aDate));"
}
}
}
Но это дает странные результаты (скрипт работает в основном, но aDate является единственным возвращаемым полем и _source отсутствует). Этот выглядит как
"hits": [{
"_index": "idx1",
"_type": "type2",
"_id": "8770",
"_score": 1.0,
"fields": {
"aDate": ["2015-01-12T17:15:47"]
}
},
Я бы предпочел решение без сценариев, если это возможно.
3 ответов:
При выполнении запроса в Elasticsearch вы можете запросить у него возврат необработанных данных, например указав поля:
curl -XGET http://localhost:9200/myindex/date-test/_search?pretty -d ' { "fields" : "aDate", "query":{ "match_all":{ } } }'Даст вам дату в том формате, в котором вы ее первоначально сохранили:
{ "_index" : "myindex", "_type" : "date-test", "_id" : "AUrlWNTAk1DYhbTcL2xO", "_score" : 1.0, "fields" : { "aDate" : [ "2015-01-13T20:08:56" ] } }, { "_index" : "myindex", "_type" : "date-test", "_id" : "AUrlQnFgk1DYhbTcL2xM", "_score" : 1.0, "fields" : { "aDate" : [ 1421179734000 ] }Невозможно изменить формат даты, если вы не используете скрипт.
curl -XGET http://localhost:9200/myindex/date-test/_search?pretty -d ' { "query":{ "match_all":{ } }, "script_fields":{ "aDate":{ "script":"use( groovy.time.TimeCategory ) { new Date( doc[\"aDate\"].value ) }" } } }'Вернутся:
{ "_index" : "myindex", "_type" : "date-test", "_id" : "AUrlWNTAk1DYhbTcL2xO", "_score" : 1.0, "fields" : { "aDate" : [ "2015-01-13T20:08:56.000Z" ] } }, { "_index" : "myindex", "_type" : "date-test", "_id" : "AUrlQnFgk1DYhbTcL2xM", "_score" : 1.0, "fields" : { "aDate" : [ "2015-01-13T20:08:54.000Z" ] } }Чтобы применить формат, добавьте его следующим образом:
"script":"use( groovy.time.TimeCategory ){ new Date( doc[\"aDate\"].value ).format(\"yyyy-MM-dd\") }"Вернется
"aDate" : [ "2015-01-13" ]Чтобы отобразить
T, вам потребуется использовать кавычки, но замените их эквивалентом Unicode:"script":"use( groovy.time.TimeCategory ){ new Date( doc[\"aDate\"].value ).format(\"yyyy-MM-dd\u0027T\u0027HH:mm:ss\") }"Возвращает
"aDate" : [ "2015-01-13T20:08:54" ]
Для возврата script_fields и source
Используйте _source в запросе, чтобы указать поля, которые вы хотите вернуть:
curl -XGET http://localhost:9200/myindex/date-test/_search?pretty -d ' { "_source" : "name", "query":{ "match_all":{ } }, "script_fields":{ "aDate":{ "script":"use( groovy.time.TimeCategory ) { new Date( doc[\"aDate\"].value ) }" } } }'Вернет мое поле
name:"_source":{"name":"Terry"}, "fields" : { "aDate" : [ "2015-01-13T20:08:56.000Z" ] }Использование asterisk вернет все поля, например:
"_source" : "*","_source":{"name":"Terry","aDate":1421179736000}, "fields" : { "aDate" : [ "2015-01-13T20:08:56.000Z" ] }
Как LabOctoCat упоминалось, Olly Cruickshank Ответ больше не работает в elastic 2.2. Я изменил сценарий на:
"script":"new Date(doc['time'].value)"Вы можете отформатировать дату в соответствии с этим.
Сценарий он вычисляет ответ только при извлечении строки. Это дорого и не позволяет использовать любые функции поиска, связанные с датой, в Elasticsearch.
Перед вставкой необходимо создать поле elasticsearch "дата". Похоже, что объект java Date () будет делать.
Comments