Руководство по миграции Java time
Начиная с версии 7.0, Elasticsearch перешел с joda time на java time для обработки, форматирования и вычислений дат. Это руководство поможет вам определить, затронут ли ваш кластер, и, если да, подготовиться к обновлению.
Преобразование форматов дат
Для обновления до Elasticsearch 8 вам необходимо преобразовать все форматы дат joda-time в эквиваленты java-time.
Затронутые функции
Переход на java time затрагивает только пользовательские форматы date и date_nanos.
Эти форматы обычно используются в:
Если вы не используете пользовательские форматы дат, можете пропустить остальную часть этого руководства. Большинство пользовательских форматов совместимы. Однако для некоторых требуется обновление.
Чтобы определить, затронут ли ваш формат даты, используйте API информации о устаревании или помощника по обновлению Kibana.
Несовместимые форматы дат
Следует перенести пользовательские форматы дат, содержащие следующие литералы joda-time.
-
Y(Год эры) -
Замените на
y.Пример:
YYYY-MM-ddдолжно статьyyyy-MM-dd.В java time используется
Yдля года, основанного на неделе. ИспользованиеYвместоyможет привести к ошибкам смещения на единицу при расчете года.Для шаблона
YYYY-wwи даты2019-01-01T00:00:00.000Zбудет получено2019-01. Для шаблонаYYYY-wwи даты2018-12-31T00:00:00.000Zбудет получено2019-01(противоинтуитивно), так как в 2019 году в этой неделе было больше 4 дней. -
y(Год) -
Замените на
u.Пример:
yyyy-MM-ddдолжно статьuuuu-MM-dd.В java time используется
yдля года эры.uможет содержать не положительные значения, в то время какyнет.yтакже может быть связан с полем эры. -
C(Век эры) -
Век эры не поддерживается в java time. Замены нет. Вместо этого рекомендуется предварительно обработать ваш ввод.
-
x(Год недели) -
Замените на
Y.В java time
xозначает смещение часового пояса.Неправильное преобразование
x(Год недели) вYможет привести к потере данных. -
Z(Смещение/идентификатор часового пояса) -
Замените на несколько
X.Zимеет аналогичное значение в java time. Однако java time ожидает разное количество литералов для анализа различных форм.Рассмотрите возможность миграции на
X, что предоставляет больший контроль над способом анализа времени. Например, формат joda-timeYYYY-MM-dd'T'hh:mm:ssZZпринимает следующие даты:2010-01-01T01:02:03Z 2010-01-01T01:02:03+01 2010-01-01T01:02:03+01:02 2010-01-01T01:02:03+01:02:03
В java time вы не можете проанализировать все эти даты с помощью одного формата. Вместо этого вам необходимо указать 3 отдельных формата:
2010-01-01T01:02:03Z 2010-01-01T01:02:03+01 both parsed with yyyy-MM-dd'T'hh:mm:ssX 2010-01-01T01:02:03+01:02 yyyy-MM-dd'T'hh:mm:ssXXX 2010-01-01T01:02:03+01:02:03 yyyy-MM-dd'T'hh:mm:ssXXXXX
Затем форматы должны быть разграничены с помощью
||:yyyy-MM-dd'T'hh:mm:ssX||yyyy-MM-dd'T'hh:mm:ssXXX||yyyy-MM-dd'T'hh:mm:ssXXXXX
То же самое относится, если ожидается, что шаблон будет встречаться без двоеточия (
:): например, форматYYYY-MM-dd'T'hh:mm:ssZпринимает следующие формы дат:2010-01-01T01:02:03Z 2010-01-01T01:02:03+01 2010-01-01T01:02:03+0102 2010-01-01T01:02:03+010203
Для приема всех этих форм в java time необходимо использовать разделитель
||:yyyy-MM-dd'T'hh:mm:ssX||yyyy-MM-dd'T'hh:mm:ssXX||yyyy-MM-dd'T'hh:mm:ssXXXX
-
d(День) -
В java time
dвсе еще интерпретируется как "день", но менее гибкий.Например, формат даты joda-time
YYYY-MM-ddпринимает2010-01-01или2010-01-1.В java time для указания каждого формата необходимо использовать разделитель
||:yyyy-MM-dd||yyyy-MM-d
В java time
dтакже не принимает более 2 цифр. Чтобы принять дни с более чем двумя цифрами, вы должны включить текстовый литерал в ваш формат даты java-time. Например, для анализа2010-01-00001необходимо использовать следующий формат даты java-time:yyyy-MM-'000'dd
-
e(Название дня) -
В java time
eвсе еще интерпретируется как "название дня", но не анализирует короткие или полные текстовые формы.Например, формат даты joda-time
EEE YYYY-MMпринимает какWed 2020-01, так иWednesday 2020-01.Для приема обеих этих дат в java time необходимо указать каждый формат с помощью разделителя
||:cccc yyyy-MM||ccc yyyy-MM
Литерал joda-time
Eинтерпретируется как "день недели". Литерал java-timecинтерпретируется как "локальный день недели".Eне принимает полные текстовые форматы дней, такие какWednesday. -
EEEEи аналогичные текстовые формы -
Поддержка полных текстовых форм зависит от данных локали, предоставляемых вашим Java Development Kit (JDK), и других реализационных деталей. Перед обновлением рекомендуется тщательно проверить форматы, содержащие эти шаблоны.
-
z(Текст часового пояса) -
В java time
zвыводит Z для UTC при задании часового пояса UTC.
Тестирование с вашими данными
Настоятельно рекомендуется протестировать все изменения формата дат с реальными данными перед развертыванием в рабочей среде.
Обновление карт индексов
Чтобы обновить форматы дат joda-time в картах индексов, необходимо создать новый индекс с обновленной картой и повторно индексировать ваши данные в него.
Следующий индекс my-index-000001 содержит карту для поля datetime, поля date с пользовательским форматом даты joda-time.
resp = client.indices.get_mapping(
index="my-index-000001",
)
print(resp) response = client.indices.get_mapping( index: 'my-index-000001' ) puts response
const response = await client.indices.getMapping({
index: "my-index-000001",
});
console.log(response); GET my-index-000001/_mapping
{
"my-index-000001" : {
"mappings" : {
"properties" : {
"datetime": {
"type": "date",
"format": "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
}
}
}
}
} Чтобы изменить формат даты для поля datetime, создайте отдельный индекс, содержащий обновленную карту и формат даты.
Например, следующий индекс my-index-000002 изменяет формат даты поля datetime на uuuu/MM/dd HH:mm:ss||uuuu/MM/dd||epoch_millis.
response = client.indices.create(
index: 'my-index-000002',
body: {
mappings: {
properties: {
datetime: {
type: 'date',
format: 'uuuu/MM/dd HH:mm:ss||uuuu/MM/dd||epoch_millis'
}
}
}
}
)
puts response PUT my-index-000002
{
"mappings": {
"properties": {
"datetime": {
"type": "date",
"format": "uuuu/MM/dd HH:mm:ss||uuuu/MM/dd||epoch_millis"
}
}
}
} Затем повторно индексируйте данные из старого индекса в новый.
Следующий запрос API повторной индексации повторно индексирует данные из my-index-000001 в my-index-000002.
response = client.reindex(
body: {
source: {
index: 'my-index-000001'
},
dest: {
index: 'my-index-000002'
}
}
)
puts response POST _reindex
{
"source": {
"index": "my-index-000001"
},
"dest": {
"index": "my-index-000002"
}
} Если вы используете псевдонимы индексов, обновите их, чтобы они указывали на новый индекс.
POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "my-index-000001", "alias" : "my-index" } },
{ "add" : { "index" : "my-index-000002", "alias" : "my-index" } }
]
}
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/migrate-to-java-time.html