Elasticsearch 8.16 和 JDK 23 中的语言环境变化

作者:来自 Elastic Simon Cooper

随着 JDK 23 即将发布,语言环境信息中有一些重大变化,这将影响 Elasticsearch 以及你提取和格式化日期时间数据的方式。首先,介绍一些背景知识。

什么是语言环境?

每次 Java 程序需要解析或格式化使用文本字符串的日期格式(例如,“Tuesday 16th July”)时,它都需要查阅一组内部表格,其中包含有关应该使用哪些字符串的信息,用于星期几和月份字段等。此信息取决于所使用的语言(英语、法语、阿拉伯语等),在某些情况下还取决于所使用的特定国家或地区。

受影响的不仅仅是日期 — 从数字格式、日历和时间格式到每个时区的名称和每个其他语言环境的所有内容都在这些表中。特别是,这还包括用于计算星期日期的信息 - 从年初开始计算的周数,而不是日历月。所有这些信息都打包到该语言的语言环境中。

Elasticsearch 如何使用语言环境信息?

Elasticsearch 在 JDK 上运行。这意味着我们使用 JDK 提供的语言环境信息。每次你有一个解析文本日期或星期日期的日期映射器时,内部 JDK 语言环境表都会用于将这些格式映射到表示你指定的语言环境(或默认根语言环境,如果没有另行指定)的相应日期信息的数据结构。

在 Java 版本 7 及之前版本中,JDK 使用由 Sun 和 Oracle 创建的自己的内部语言环境表来存储 JDK 使用的所有语言环境信息。在 2014 年发布的 JDK 8 中,Oracle 在内部 JDK 数据库旁边添加了 Unicode Consortium 提供的 CLDR 语言环境数据库,并在 JDK 9 中将其设为默认语言环境(locale)数据库。CLDR 数据库和原始 JDK 数据库(以下称为 COMPAT 数据库)之间存在大量变化,因此当时 Elasticsearch 继续使用 COMPAT 数据库来维护数据和索引兼容性。

那么,到底有什么变化呢?

最近的 JDK 版本 JDK 23 完全删除了 Elasticseach 当前使用的 COMPAT 数据库,只留下 CLDR 作为语言环境设置数据的唯一选项。这意味着当我们升级到使用 JDK 23 时,我们被迫更改在 JDK 23 及更高版本上运行的 Elasticsearch 所使用的语言环境设置数据库。

CLDR 中的语言环境设置数据库有两个方面正在发生变化 - 文本字段值和星期日期计算。

首先,用于表示日期中各种文本字段的字符串在许多区域设置中都在发生变化 - 差异很小,但范围很广。以下是一些示例:

COMPATCLDR
English period-of-dayAM, PMin the morning, in the afternoon, in the evening
English quarter names1, 2, 3, 4Q1, Q2, Q3, Q4
German short day-of-week namesSo, Mo, Di, Mi…So., Mo., Di., Mi. …
French narrow era namesB, Aav. J.-C., ap. J.-C.
Portuguese long day-of-week namesDomingo, Segunda-feira, Terça-feira…domingo, segunda-feira, terça-feira…

这意味着,如果你在 de 语言环境中使用日期格式字符串 EEE d MMM yyyy,则在 JDK 22 上,它将接受文本 Mi 4 Dez 2024;在 JDK 23 上,它只接受 Mi. 4 Dez. 2024(请注意额外的点)。

其次,用于计算星期日期的基础数据正在发生变化。这些日期通常采用 2024-W34-2 格式,计算自一年开始以来的周数,而不是日历月份和天数。但年份通常不从一周的第一天开始;如果 1 月 1 日是星期五,那是该年的第一周,还是前一年最后一周的一部分?为了了解这一点,语言环境提供了有关一周需要多少天才能算作一周以及哪一天是新一周开始的信息。

在 COMPAT 中,这些值采用各种值,具体取决于语言环境。通常,以星期日或星期一作为第一天,一周至少有 1 天或 4 天。在 CLDR 中,对于每个语言环境,这都会更改为一周的第一天为星期日,一周至少有 1 天。这适用于使用 Y、W 或 w 说明符的所有自定义日期格式。

内置的星期格式(week_date、weekyear_week_date 等)始终并将继续使用 ISO 星期日期定义,即一周的第一天为星期一,一周至少有 4 天,无论底层语言环境数据库和 JDK 版本如何。

作为 Elasticsearch 用户,这对我意味着什么?

如果你使用带有文本或星期日期字段说明符的自定义日期格式化程序,则会影响你。否则,你不会受到影响。如果你使用的日期格式说明符在升级到 JDK 23 时可能会发生变化,那么从 v8.15.2 开始的 Elasticsearch 将记录弃用警告(可在 Kibana 中看到)。

Elasticsearch 将继续随 JDK 22 一起提供给所有剩余的 v7.17.x 和 v8.15.x 版本,并将使用 COMPAT 语言环境数据库。从 v7.17.25 和 v8.15.2 开始的 Elasticsearch 版本将支持在 JDK 23 上作为自定义 JDK 运行,并且将使用 CLDR 数据库(如果是)。

如果你在 JDK 23 或更高版本上运行 Elasticsearch 版本 v7.17.24 或 v8.15.1 或更早版本,它将根本没有语言环境信息。 Elasticseach 将尝试加载 JDK 23 上不存在的 COMPAT 数据库,然后它将默认仅使用根语言环境(即基本英语)。这可能会导致一些奇怪的行为,特别是如果你使用非英语语言环境。

从 Elasticsearch 版本 8.16.0 开始,Elasticsearch 将随 JDK 23 一起提供,并默认使用 CLDR 语言环境数据库。这意味着,如果你使用文本字符串提取或输出日期,Elasticsearch 使用和接受的确切字符串可能会发生变化。如果你使用自定义星期日期提取或输出数据,星期日期可能会发生变化。这不仅会影响现在提取的数据,还会影响已在以前的 JDK 版本上提取到 Elasticsearch 中的数据。

为了减少对根语言环境进行最广泛更改的影响,在 v8.16.0 中,日期字段和日期处理器的默认语言环境将从根语言环境更改为 en,除了长时代(long era)名称和季度(quarter)名称外,COMPAT 和 CLDR 之间的语言环境相同。

如果你现在不想适应此更改,你可以继续在 JDK 22 或更低版本上运行任何版本的 Elasticsearch v7 或 v8,Elasticsearch 将使用这些版本中存在的 COMPAT 语言环境数据库。

从 Elasticsearch v9 开始,Elasticsearch 将使用 CLDR 语言环境数据库,无论它运行在哪个 JDK 版本上。

请注意,一旦 JDK 23 发布,Oracle 将不再支持 JDK 22,并且该版本上的任何未来错误和 CVE 都不会得到修复。 JDK 21 是 Java 当前的长期支持版本,如果在 JDK 21 上运行,Elasticsearch 的所有 v7 和 v8 版本都将使用 COMPAT 数据库。

要将自定义 JDK 与 Elasticsearch 一起使用,请按照以下说明操作。请注意,从预构建的 docker 映像或在 Elastic Cloud 上运行时无法做到这一点。

如何处理字符串更改?

首先,使用输入数据在 JDK 23 上测试 Elasticsearch,以检查你是否真的受到此影响。此更改将导致 Elasticsearch 将之前有效的日期字段拒绝为无效数据。如果你使用 B、G、E、O、L、M、Q、Z、a、c、e、q、v 或 z 字段说明符自定义日期格式,则最有可能出现这种情况。如果其中一个说明符与 COMPAT 语言环境数据库一起使用,Elasticsearch v8.15.2 及更高版本会将 Date format [<format>] contains textual field specifiers that could change in JDK 23 记录到 Elasticsearch 日志中,并作为相关查询的警告标头。

如果你受到影响,你可以选择在 JDK 22 及以下版本上运行 Elasticsearch,以完成其余的 v8 版本。或者,你可以修改输入数据以解决字符串的差异 - 这可以作为摄取管道的一部分来完成,也可以通过在数据到达 Elasticsearch 之前在源处修改数据来完成。

要确定特定日期格式化程序所接受的新字符串,你可以在运行 JDK 23 的独立 Java 项目中使用自定义日期格式创建 DateTimeFormatter,并测试它对各种 ZonedDateTime 对象的输出,或者使用 Calendar.getDisplayNames 方法获取特定语言环境的所有可接受字符串。

如果你受到字符串格式更改的影响,你还需要使用旧字符串处理现有数据的重新索引 — 你需要在重新索引期间指定一个脚本以将旧字符串更改为新字符串,如下所示:

String updateDate(String date) {
return date
.replace("Monday", "Mon")
.replace("Tuesday", "Tue")
.replace("Wednesday", "Wed")
.replace("Thursday", "Thu")
.replace("Friday", "Fri")
}
ctx._source.my_date_field = updateDate(ctx._source.my_date_field);

不幸的是,如何处理这种变化取决于你的具体情况以及你使用的日期格式。

如何处理星期日期的更改?

如果你使用带有 Y、W 或 w 说明符的自定义星期格式,这些格式生成的日期可能会发生变化。你需要更改为使用使用 ISO 星期日期定义的内置格式之一,使用上述自定义脚本修改摄取、输出和重新索引时的日期,或调整集成代码以使用与 CLDR 数据库相同的方式计算星期日期(星期日是一周的第一天,一周至少 1 天)。

特别是,如果你使用 Y 说明符作为日历日期格式的一部分,则你可能使用错误;Joda 时间使用 Y 表示纪年(year-of-era),但 JDK 使用 Y 表示星期年(week-year)。你需要修改格式以使用 y,或更改为内置格式。

重申

  • 如果在 JDK 23 及更高版本上运行,Elasticsearch 版本 7.17.24 和 8.15.1 及更早版本将无法访问任何语言环境数据。
  • 所有剩余的 7.17.x 和 8.15.x 补丁版本将继续随 JDK 22 一起发布,默认情况下均使用 COMPAT 语言环境数据库。它们将支持在 JDK 23 上运行,并在这种情况下使用 CLDR 语言环境数据库。
  • 8.16.0 及更高版本将随 JDK 23 一起发布,默认情况下将使用 CLDR 语言环境数据库。如果在 JDK 22 或更低版本上运行 Elasticsearch 版本 8.16.0 及更高版本,它们将改用 COMPAT 语言环境数据库。
  • 8.16.0 将把日期字段和日期处理器的默认语言环境更改为 en。
  • Elasticsearch v9 发布时将使用 CLDR 语言环境数据库,无论它运行在哪个 JDK 版本上。

本文中描述的任何特性或功能的发布和时间均由 Elastic 自行决定。任何当前不可用的特性或功能可能无法按时交付或根本无法交付。

原文:Locale changes in Elasticsearch 8.16 and JDK 23 | Elastic Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/438180.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

理解Matplotlib构图组成

介绍 Matplotlib 是 Python 中最流行的数据可视化库之一。它提供了一系列丰富的工具&#xff0c;可以绘制高度自定义且适用于各种应用场景的图表。无论你是数据科学家、工程师&#xff0c;还是需要处理数据图形表示的任何人&#xff0c;理解如何操作和定制 Matplotlib 中的图表…

三、数据链路层(上)

目录 3.1数据链路层概述 3.1.1术语 3.1.2功能 3.2封装成帧和透明传输 3.2.1封装成帧 ①字符计数法 ②字符&#xff08;节&#xff09;填充法 ③零比特填充法 ④违规编码法 3.2.2透明传输 3.2.3差错控制 差错原因 检错编码 奇偶校验 ☆循环冗余码CRC 例题 纠错…

骨架屏 (懒加载优化)

骨架屏 &#xff08;懒加载优化&#xff09; 即便通过 Webpack 的按需加载、CDN 静态资源缓存 和 代码分割 等技术来减少首屏的代码体积&#xff0c;首屏加载时的白屏时间&#xff08;也称为首屏等待时间&#xff09;仍然可能存在&#xff0c;尤其在网络条件较差或页面内容复杂…

MongoDB 快速入门+单机部署(附带脚本)

目录 介绍 体系结构 数据模型 BSON BSON 数据类型 特点 高性能 高可用 高扩展 丰富的查询支持 其他特点 部署 单机部署 普通安装 脚本安装 Docker Compose 安装 卸载 停止 MongoDB 删除包 删除数据目录 参考&#xff1a; https://docs.mongoing.com/ 介绍…

python全栈学习记录(二十一)类的继承、派生、组合

类的继承、派生、组合 文章目录 类的继承、派生、组合一、类的继承二、派生三、组合 一、类的继承 继承是一种新建类的方式&#xff0c;新建的类称为子类&#xff0c;被继承的类称为父类。 继承的特性是&#xff1a;子类会遗传父类的属性&#xff08;继承是类与类之间的关系&a…

2024年研究生数学建模“华为杯”E题——肘部法则、k-means聚类、目标检测(python)、ARIMA、逻辑回归、混淆矩阵(附:目标检测代码)

文章目录 一、情况介绍二、思路情况二、代码展示三、感受 一、情况介绍 前几天也是参加了研究生数学建模竞赛&#xff08;也就是华为杯&#xff09;&#xff0c;也是和本校的两个数学学院的朋友在网上组的队伍。昨天&#xff08;9.25&#xff09;通宵干完论文&#xff08;一条…

Prompt 初级版:构建高效对话的基础指南

Prompt 初级版&#xff1a;构建高效对话的基础指南 文章目录 Prompt 初级版&#xff1a;构建高效对话的基础指南一 “标准”提示二 角色提示三 多范例提示四 组合提示五 规范化提示 本文介绍了提示词的基础概念与不同类型&#xff0c;帮助用户更好地理解如何在对话中构建有效的…

Pytorch实现玉米基因表达量预测模型

一、实验要求 通过搭建残差卷积网络&#xff0c;实现对玉米基因表达量的预测 二、实验目的 理解基因表达量预测问题&#xff1a;基因表达预测是生物信息学和基因组学领域中的重要任务之一&#xff0c;促进学科交叉融合。熟悉深度学习框架PyTorch&#xff1a;通过实现基因表达量…

css 数字比汉字要靠上

这个问题通常是由于数字字体的下排的问题造成的&#xff0c;也就是数字的底部边缘位置比汉字的顶部边缘位置更靠下。为了解决这个问题&#xff0c;可以尝试以下几种方法&#xff1a; 使用CSS的vertical-align属性来调整对齐方式。例如&#xff0c;可以将数字的对齐方式设置为to…

Linux高级编程_27_系统调用

文章目录 系统调用函数分类系统编程概述系统调用概述**类UNIX系统的软件层次** 用户态和内核态系统调用与库函数的关系文件操作符概述文件磁盘权限 系统调用之文件操作open:打开文件close:关闭文件write:写入read:读取 文件状态fcntl 函数stat 函数 st_mode的值示例 1&#xff…

【优选算法之队列+宽搜/优先级队列】No.14--- 经典队列+宽搜/优先级队列算法

文章目录 前言一、队列宽搜示例&#xff1a;1.1 N 叉树的层序遍历1.2 ⼆叉树的锯⻮形层序遍历1.3 ⼆叉树最⼤宽度1.4 在每个树⾏中找最⼤值 二、优先级队列&#xff08;堆&#xff09;示例&#xff1a;2.1 最后⼀块⽯头的重量2.2 数据流中的第 K ⼤元素2.3 前 K 个⾼频单词2.4 …

数造科技入选中国信通院《高质量数字化转型产品及服务全景图》三大板块

9月24日&#xff0c;2024大模型数字生态发展大会暨“铸基计划”年中会议在北京召开。会上&#xff0c;中国信通院发布了2024年《高质量数字化转型产品及服务全景图&#xff08;上半年度&#xff09;》和《高质量数字化转型技术解决方案&#xff08;上半年度&#xff09;》等多项…

网络编程篇:UDP协议

一 UDP协议格式 16位源端口号&#xff1a;表示数据从哪里来。16位目的端口号&#xff1a;表示数据要到哪里去。16位UDP长度&#xff1a;表示整个数据报&#xff08;UDP首部UDP数据&#xff09;的长度。16位UDP检验和&#xff1a;如果UDP报文的检验和出错&#xff0c;就会直接将…

【Kubernetes】常见面试题汇总(五十三)

目录 118. pod 状态为 ErrlmagePull &#xff1f; 119.探测存活 pod 状态为 CrashLoopBackOff &#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。…

MongoDB聚合操作及索引底层原理

目录 链接:https://note.youdao.com/ynoteshare/index.html?id=50fdb657a9b06950fa255a82555b44a6&type=note&_time=1727951783296 本节课的内容: 聚合操作: 聚合管道操作: ​编辑 $match 进行文档筛选 ​编辑 将筛选和投影结合使用: ​编辑 多条件匹配: …

Springboot + netty + rabbitmq + myBatis

目录 0.为什么用消息队列1.代码文件创建结构2.pom.xml文件3.三个配置文件开发和生产环境4.Rabbitmq 基础配置类 TtlQueueConfig5.建立netty服务器 rabbitmq消息生产者6.建立常规队列的消费者 Consumer7.建立死信队列的消费者 DeadLetterConsumer8.建立mapper.xml文件9.建立map…

King3399 SDK(ubuntu文件系统)编译简明教程

该文章仅供参考&#xff0c;编写人不对任务实验设备、人员及测量结果负责&#xff01;&#xff01;&#xff01; 0 引言 文章主要介绍King3399&#xff08;瑞芯微rk3399开发板&#xff0c;荣品&#xff09;官方SDK&#xff08;Ubuntu文件系统&#xff09;编译过程&#xff0c…

【本地免费】SimpleTex 图像识别latex公式

文章目录 相关教程相关文献安装教程 由于mathpix开始收费了&#xff0c;于是本文将介绍一款目前本地免费的SimpleTex工具 相关教程 【超详细安装教程】LaTeX-OCR 图像识别latex公式&#xff08;开源免费&#xff09;_latex图片识别-CSDN博客 相关文献 SimpleTex主页——致力…

Elasticsearch使用Easy-Es + RestHighLevelClient实现深度分页跳页

注意&#xff01;&#xff01;&#xff01;博主只在测试环境试了一下&#xff0c;没有发到生产环境跑。因为代码还没写完客户说不用弄了( •̩̩̩̩&#xff3f;•̩̩̩̩ ) 也好&#xff0c;少个功能少点BUG 使用from size的时候发现存在max_result_window10000的限制&…

薄膜凸起和开裂是同一种应力导致的吗?

知识星球里的学员问&#xff1a;我们产线上薄膜出了质量问题&#xff0c;都一概归结为应力过大。麻烦讲讲应力的种类&#xff0c;以及不同种类的应力会造成哪些薄膜问题&#xff1f; 内应力的种类&#xff1f; 内应力的分类很多&#xff0c;如果我们按作用的效果来分&#xff…