Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Руководство по миграции ›Миграция на 8.0

Руководство по миграции 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-time YYYY-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-time c интерпретируется как "локальный день недели". 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API