关于ElasticSearch日期格式不一致的异常,可以这么解决

news2024/9/20 16:47:01

最近壹哥的一个学生,在利用spring-data-elasticsearch访问ElasticSearch(ES)时,遇到了一个关于日期类型的BUG,困扰了很久。然后他就找壹哥给他解决,接下来壹哥就把解决的过程给大家复现一下,希望本文可以给遇到同样问题的同学一点启发。

一. 问题复现

1. 原始代码

我们先来看看他的POM.xml文件配置,如下所示:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.9.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

 <dependencies>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
     </dependency>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
</dependencies>

实体类的代码如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "user_info",shards = 1,replicas = 1,createIndex = false)
public class UserInfo {

    @Id
    @Field(type = FieldType.Long)
    private Long id;

    @Field(type = FieldType.Keyword)
    private String name;

    @Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String remark;

    @Field(type = FieldType.Date,format = DateFormat.date_time)
    private Date jobday;

}

创建索引的单元测试类代码如下:

@Test
void createIndex() {
    // 创建索引
    elasticsearchRestTemplate.createIndex(UserInfo.class);

    // 声明索引中 mapping部分
    elasticsearchRestTemplate.putMapping(UserInfo.class);
}

以下是ES中创建的索引 Mapping结构,其中日期类型的format为date_time。

看了以上代码,你能猜出来哪里有问题吗?其实这个bug是发生在写入操作中,代码如下:

@Test
void save() {

    final UserInfo userInfo = new UserInfo();
    userInfo.setId(100l);
    userInfo.setName("张三");
    userInfo.setJobday(new Date());
    userInfo.setRemark("张三是法外狂徒");

    userRepository.save(userInfo);
}

2. 异常信息

我们来看看产生的异常信息。

Caused by: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=Invalid format: "1669366585010" is malformed at "5010"]]
        at org.elasticsearch.ElasticsearchException.innerFromXContent(ElasticsearchException.java:509)
        at org.elasticsearch.ElasticsearchException.fromXContent(ElasticsearchException.java:420)
        at org.elasticsearch.ElasticsearchException.innerFromXContent(ElasticsearchException.java:450)
        at org.elasticsearch.ElasticsearchException.failureFromXContent(ElasticsearchException.java:616)
        at org.elasticsearch.rest.BytesRestResponse.errorFromXContent(BytesRestResponse.java:169)
        ... 87 more

通过查看报错信息,我们可以发现该bug是由于写入请求时,给定的日期格式与mapping中限定的date_time格式不一致导致的

二. 异常原因分析

既然是时间格式有问题,那么我们就需要知道写请求中的日期格式,与ES mapping中的date_time格式分别是什么。

从日志中我们可以看到,写入请求中的日期格式为 1669366585010,即long型整数的时间戳格式。根据ES的官方文档,我们可以看到date_time的格式要求如下:

 我们可以可以看到,ES里的格式默认为: yyyy-MM-dd'T'HH:mm:ss.SSSZ

这样bug产生的原因就很清晰了,该学生写入请求中的是 long,而ES索引中要求的是 yyyy-MM-dd'T'HH:mm:ss.SSSZ,这两个不一致,自然就报错了

三. 解决思路

既然我们现在明白了bug的产生原因,解决起来也就很容易了,只要把日期格式匹配上即可。现在springboot-data中写入的是long,只要让ES mapping中能够接收long格式即可。

1. 修改配置

修改后的代码配置如下所示:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "user_info",shards = 1,replicas = 1,createIndex = false)
public class UserInfo {

    @Id
    @Field(type = FieldType.Long)
    private Long id;

    @Field(type = FieldType.Keyword)
    private String name;

    @Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String remark;

    // 这里不要写 format即可,默认的date类型就可以接收 long值
    @Field(type = FieldType.Date)
    private Date jobday;

}

2. mapping结构

mapping结构如下所示,这里的date就可以接收long类型的值了。

 3. 单元测试

接下来我们重新进行单元测试,此时发现,代码可以正常执行通过了。

@Test
void save() {

    final UserInfo userInfo = new UserInfo();
    userInfo.setId(100l);
    userInfo.setName("张三");
    userInfo.setJobday(new Date());
    userInfo.setRemark("张三是法外狂徒");

    userRepository.save(userInfo);
}

 现在你知道这个问题怎么解决了吗?以后再遇到类似的问题,不要慌,沉下心来仔细想一下问题出在哪里,然后一点点针对该问题进行分析解决。如果你实在解决不了,给壹哥私信,我来帮你搞定。关注Java架构栈,干货天天都不断哦!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

构建灵活订单系统,B2B撮合管理系统提升光伏企业订单管理效率

光伏系统是利用半导体光生伏特效应将太阳能转化为电能的发电系统。过去20年&#xff0c;我国光伏制造业快速发展&#xff0c;由弱变强。经过20年高速发展&#xff0c;我国在硅片、电池片、组件制造等多领域处于世界领先水平&#xff0c;我国已经成为全球第一大光伏生产国、消费…

深度学习Week9-YOLOv5-C3模块实现(Pytorch)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;Pytorch实战 | 第P8天&#xff1a;YOLOv5-C3模块实现(训练营内部成员可读)&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制了解C3的结构&#xff0c;方便…

前端Gitee + Jenkins自动化实战(转)

# 前端Gitee Jenkins自动化实战 当我们熟悉了Jenkins 的使用后&#xff0c;接下来我们来配置一个基于 vue-element-admin 的实战项目&#xff0c;来感受一下自动化流程带给我们的优势。 首先我们需要创建一个 git 项目&#xff0c;至于代码仓库可以自选&#xff0c;这里为了…

RocketMq: Windows环境-单机部署和多种主从集群场景部署

关于默认端口 broker的默认端口有3个,10911, 10912, 10909。 10911是remotingServer使用的监听端口,remotingServer主要处理以下三类消息: producer发送的消息 conumser在消费失败或者消费超时发送的消息 consumer拉取消息10912是主broker用于监听从broker请求…

HTML学生个人网站作业设计:公益专题扫黑除恶(HTML+CSS)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

扩散模型Diffusion轻松入门

如果要问最近模型领域什么东西最火&#xff0c;应该非扩散模型莫属&#xff0c;火得我觉得不系统学习一下都不行&#xff01; 本文是我的学习笔记&#xff0c;只能叫入门文章&#xff0c;因为扩散模型的严谨数学推导公式很多&#xff0c;还没有研究透彻&#xff0c;不敢说一文…

c语言:关键字(二)

关键字一.声明的关键词—extern二.最名不符实的关键字—static一.声明的关键词—extern 首先这里问两个问题 1.变量可以跨文件访问吗&#xff1f; 2.函数可以跨文件访问吗&#xff1f; 答案是都可以 那么什么是跨文件呢&#xff1f; 我在game.c里定义show函数&#xff0c;但…

Vue2基础篇-01-Vue2 入门概述

1. 概述 该教程站在小白的角度&#xff0c;去帮助理解和使用&#xff0c;达到入门的效果&#xff1b;该教程覆盖面比较浅&#xff0c;更多详情请查阅 Vue2文档 &#xff0c;目前最新是Vue3文档&#xff0c;但是Vue2是公司目前大多数使用的&#xff1b;欢迎大家一起指正并下方留…

Unity 符号表

目录 前言 关于Unity符号表 正文 程序crash日志&#xff1a; 解析 后记 记一次 Bugly 崩溃查找过程 unity-il2cpp&#xff1a; 前言 关于Unity符号表 关于项目真机调试时的崩溃问题&#xff0c;一般可以 logcat 或 xcode 看到相关的crash日志&#xff0c;拿到崩溃时的堆…

Python均匀分布和三角形分布

文章目录均匀分布三角形分布均匀分布和三角形分布之间的关系函数备注triangular(left, mode, right)三角形分布uniform([low, high])均匀分布 均匀分布 所谓均匀分布&#xff0c;就是在事件空间中&#xff0c;所有事件的概率都是相等的连续分布&#xff0c;其概率密度为 f(x)1…

麻省理工人工智能实验室新研究!有远见的机器学习方法:能预知未来行为的AI智能体

原创/文 BFT机器人 近日&#xff0c;麻省理工学院的研究人员开发出一种新技术&#xff0c;让AI智能体能够思考更远的未来&#xff0c;寻找更合适的合作与竞争长期解决方案。 想象一个游戏规则&#xff1a;两支足球队在球场上PK&#xff0c;玩家们可以选择相互合作合作来实现目…

[附源码]Python计算机毕业设计Django学生宿舍管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

web前端期末大作业:云南旅游网页主题网站设计——云南城市旅游5页HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计&#x1f469;‍&#x1f393;&#xff0c;一般的网页作业需要融入以下知识点&#xff1a;div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

c + linux + cmake + arm + MQTT

先给你们看个最终代码结构吧,因为我改过的代码会加密,所以我只能放一部分源码,另外一部分源码我会直接贴在博客,具体使用我会在博客里面说明! 1.MQTTPacket源码库(MQTTPacket源码地址) 2.MQTTClient.c /*********************************************************************…

Linux中线程池的制作

一.介绍 1.1概念 一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用&#x…

如何从github上克隆库、跑库

第一步&#xff1a;在Github上找到想要的库&#xff0c;以YOLOv3项目为例。 第二步&#xff1a;拷贝这个库到自己的电脑上&#xff0c;下载到本地。 方法一&#xff1a;在GitHub上&#xff0c;Code -> Download ZIP&#xff08;有的时候会有一些问题&#xff0c;不建议&…

DBW*的trace文件过大的bug

问题描述&#xff1a; 近期某现场发现trace目录下的dbw*文件达到了大几G的大小导致/oracle目录占用率突增&#xff0c;删除这些trace文件&#xff0c;几天后又重新生成较大的dbw*的trace 11G Dec 4 10:38 rb_dbw0_2086848.trc 3.6G Dec 4 10:38 rb_dbw1_2086852.trc 4.4G De…

前端工程师常考手写面试题指南

实现 add(1)(2)(3) 函数柯里化概念&#xff1a; 柯里化&#xff08;Currying&#xff09;是把接受多个参数的函数转变为接受一个单一参数的函数&#xff0c;并且返回接受余下的参数且返回结果的新函数的技术。 1&#xff09;粗暴版 function add (a) { return function (b) …

码云线上误删主项目文件夹的恢复

码云线上误删主项目文件夹的恢复前言描述解决办法解决问题前言描述 本来某个项目即将上线&#xff0c;然后同事不知道怎么的&#xff0c;直接打开了自己的码云&#xff0c;在网站上把主项目目录删除了。。。。是的&#xff0c;删除了&#xff01;&#xff01;&#xff01;&…

职场生涯亮红灯要注意这些

很多时候&#xff0c;当事业变红的时候&#xff0c;很多年轻人还在傻傻地工作。他们做的事情越多&#xff0c;在不被领导看重的情况下&#xff0c;就越不会得到领导的重用。在关心下属的时候&#xff0c;会在无形中释放出一些不好的信号&#xff0c;这是一种被领导抛弃的行为。…