Форматирование даты в запросе 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"]
}
},


Я бы предпочел решение без сценариев, если это возможно.

771   3  

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

    Ничего не найдено.