Вы можете использовать безболезненный язык сценариев для достижения того, что вы хотите, но это будет неэффективно, так как безболезненные сценарии имеют большие издержки при манипулировании полем. Вот скриптовый способ сделать это
. Вы можете установить формат и преобразовать длинный в мгновение эпохи и отформатировать его так, как вы хотите. Как уже упоминалось, это неэффективно, но будет работать.
{
"aggs": {
"dt_terms": {
"terms": {
"script": {
"source": """
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault());
return df.format(Instant.ofEpochMilli(doc['ts'].value));
""",
"lang": "painless"
}
}
}
}
}
Поскольку вы не хотите изменять тип данных исходных полей, это можно сделать еще одним способом, используя поля copy_to . В вашем отображении, если вы добавляете новое поле copy_to, как показано ниже, и используете тип данных date, вам не нужно запускать сценарий и использовать поля, в которые он скопирован, для агрегирования.
PUT /index_name/_mapping
{
"properties": {
"ts": {
"type": "long",
"copy_to": "ts_d"
},
"ts_d": {
"type": "date"
}
}
}
Если у вас есть отображение выше Вы можете использовать reindex API для индексации с новым отображением, а затем использовать следующий запрос, который теперь будет работать с типом данных date.
GET /_search
{
"aggs": {
"agg_name": {
"date_histogram": {
"field": "ts_d",
"interval": "1d",
"format": "yyyy-MM-dd",
"min_doc_count": 1
}
}
}
}