Elasticsearch 8.13.4 LocalDateTime类型转换问题

news2024/9/23 11:17:13

框架背景

springboot 3.3.1+elasticseach8.13.4+spring-data-elasticsearch5.3.1(其实只要用了springboot3.3.1 上下两个的版本都在里面绑死了)

问题描述

使用spring-data-elasticsearch操作es,当字段增加映射注解,其实如果是日期类型,你不加默认也给你映射成date了

@Field(type = FieldType.Date)

可以正常保存成功,但查询时会报错

org.springframework.data.elasticsearch.core.convert.ConversionException: Unable to convert value ‘2024-08-30’ to java.time.LocalDateTime for property ‘createTime’

通过kibana查看数据

数据查询发现保存的数据格式是 “2024-08-30”,导致读取时解析失败

解决方案使用自定义的转换器,我这里是将LocalDateTime保存为时间戳,读取的时候再转为LocalDateTime

以下是配置类(我是自定义了一个starer,所以用了@AutoConfiguration)

package cn.iocoder.centralstore.framework.es.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.data.elasticsearch.core.mapping.PropertyValueConverter;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;

/***
 * @Description: 处理 Elasticsearch 中 LocalDateTime 与时间戳之间的转换
 * 将 LocalDateTime 写入为时间戳,读取时将时间戳转换为 LocalDateTime。
 * @Author: TaoYuan
 * @Date: 2024/8/29
 */
@AutoConfiguration
@Slf4j
public class CentralstoreLocalDateTimeConverter implements PropertyValueConverter {

    // 使用系统默认时区
    private static final ZoneId ZONE_ID = ZoneId.systemDefault();
    
    @Override
    public Object write(Object value) {
        if (value instanceof LocalDateTime localDateTime) {
            Instant instant = localDateTime.atZone(ZONE_ID).toInstant();
            long timestamp = instant.toEpochMilli();
            log.info("将 LocalDateTime [{}] 转换为时间戳 [{}]", localDateTime, timestamp);
            return timestamp;
        } else {
            String errorMessage = String.format("写入操作接收到非 LocalDateTime 值: [%s], 类型: [%s]", value, value.getClass().getName());
            log.error(errorMessage);
            throw new IllegalStateException(errorMessage);
        }
    }

    @Override
    public Object read(Object value) {
        if (value instanceof Long timestamp) {
            LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZONE_ID);
            log.info("将时间戳 [{}] 转换为 LocalDateTime [{}]", timestamp, localDateTime);
            return localDateTime;
        } else {
            String errorMessage = String.format("无法将值 '值: [%s], 类型: [%s] 解析为 LocalDateTime", value,value.getClass().getName());
            log.error(errorMessage);
            throw new IllegalStateException(errorMessage);
        }
    }
}

字段增加注解

@Field(type = FieldType.Date)
@ValueConverter(CentralstoreLocalDateTimeConverter.class)
private LocalDateTime createTime;```

至此,插入数据和查询数据LocalDateTime类型就搞定了。其实里面还有很多细节,但是大部分估计跟我一样,只想着找到解决方案,不去想为什么会这样。所以就懒得继续深讲了。

还有很多坑,比如使用雪花算法生成的Id是19位,存入es后后两位精度丢失,这个处理起来最简单的办法就是使用String类型的作为id。或者跟上面一样 增加一个Long类型的转换器,转为String ,读取的时候再转换为Long。这个我还没有尝试,只是目前改了一下id的数据类型。

到现在为止仍然没有整合完,还有一堆坑等着我,次奥!!!次奥!!!次奥!!!

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

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

相关文章

计算机网络概述(协议层次与服务模型)

目录 1.协议层次 2.服务模型 1.协议层次 层次化方式实现复杂网络功能: 将网络复杂的功能分成明确的层次,每一层实现了其中一个或一组功能,功能中有其上层可以使用的功能:服务本层协议实体相互交互执行本层的协议动作&#xff0…

C++(Qt)-GIS开发-QGraphicsView显示在线瓦片地图

C(Qt)-GIS开发-QGraphicsView显示在线瓦片地图 文章目录 C(Qt)-GIS开发-QGraphicsView显示在线瓦片地图1、概述2、实现效果3、主要代码4、源码地址 更多精彩内容👉个人内容分类汇总 👈👉GIS开发 👈 1、概述 支持加载显示在线瓦片…

TD学习笔记————中级教程总结(NEW)

目录 Instance功能讲解 问题: 报错All ops must generate the same number of instances (have the same length Replicator功能讲解 问题: 视频分辨率过大 Cannot find function named:onValueChange Instance功能讲解 数据通道的长度要一致 N…

redroid搭建云手机学习笔记(一)

参考链接 通过Redroid搭建自己的云手机 docker安装 docker官网目前打不开了,通过官网安装的方式无法实现,这里需要借助镜像网站来实现docker的安装 参考链接:https://developer.aliyun.com/mirror/docker-ce # step 1: 安装必要的一些系统…

Dockerfile 实例

删除不需要的镜像&#xff1a;示例&#xff1a;通配符可用 [rootdocker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 580260c93725 2 hours ago 4.27MB <none&…

基于python的足球比赛数据及可视化 python 足球预测

Python 足球可视化分析是使用 Python 编程语言来进行足球比赛数据分析&#xff0c;并将结果呈现为可视化图形的过程。Python 作为一种高效灵活的编程语言&#xff0c;可以用于数据处理和分析&#xff0c;同时也有丰富的可视化库。 足球比赛数据可以从各种数据来源获取&#xf…

使用 AI进行绘画初体验

大家好啊&#xff0c;我是董董灿。 AI 绘画的效果是真的不错&#xff0c;最近在查找AI相关技术文章时&#xff0c;总是会时不时的发现一些好玩的 AI 应用&#xff0c;而且大多数都是免费的。 今天就给大家介绍如何使用 MidJourney 来完成 AI 绘画的网站。 MidJourney 本身是…

解决 Linux 上的 SSH 登录缓慢问题

如果您必须等待很长时间才能看到 SSH 密码提示&#xff0c;则可能存在多种问题。要解决 SSH 登录缓慢的根本原因&#xff0c;您可以运行带有 -vvv 选项的 ssh 命令&#xff0c;该命令将向您显示 SSH 登录期间幕后发生的情况。 $ ssh -vvv user<ssh-server>以下是 SSH 登…

Windows bat脚本学习六(十六进制与十进制互转)

一、十六进制转十进制 十六进制数转十进制数相对比较简单&#xff0c;可以直接通过0x来实现。 见如下代码&#xff1a; echo off chcp 65001set taaset /a hex0x%t% echo data%hex%pause 结果&#xff1a; 二、十进制转十六进制 这个转化比较麻烦&#xff0c;没有简便的方式转…

前端面试题每日一练,测测你对JavaScript对象继承和 Object.entries() 的理解

今天的挑战题目涉及到JavaScript中的原型链 (prototype chain) 和 Object.entries() 方法的使用。我们将通过一个对象继承的例子来探索如何使用 Object.entries() 获取对象的自身可枚举属性&#xff0c;并进行处理。让我们一起分析这段代码&#xff0c;看看它会输出什么以及为什…

微服务CI/CD实践(四)Jenkins部署及环境配置

微服务CI/CD实践系列&#xff1a; 微服务CI/CD实践&#xff08;一&#xff09;环境准备及虚拟机创建 微服务CI/CD实践&#xff08;二&#xff09;服务器先决准备 微服务CI/CD实践&#xff08;三&#xff09;gitlab部署及nexus3部署 微服务CI/CD实践&#xff08;四&#xff09…

ClickHouse的安装教程

ClickHouse的安装教程 文章目录 ClickHouse的安装教程写在前面准备工作关闭防火墙CentOS 取消打开文件数限制安装依赖CentOS 取消 SELINUX 单机安装在 **node01** 的/opt/software 下创建 clickhouse 目录将下载的文件上传到 node01 的 /opt/software/clickhouse 目录下将安装文…

MFC工控项目实例之九选择下拉菜单主界面文本框显示菜单名

承接专栏《MFC工控项目实例之八选择下拉菜单添加打钩图标》 1、在主界面添加一个组合框和一个静态文本框。 2、在SEAL_PRESSUREDlg.cpp文件中添加代码 BOOL CSEAL_PRESSUREDlg::OnInitDialog() {CDialog::OnInitDialog(); ... GetDlgItem(IDC_STATIC_TYPNAME)->SetFont(&a…

通用大模型应用研究重点六:AgentOS

智能体&#xff1a;一个能够自主感知环境、做出决策并执行行动的系统。具备规划思考能力、记忆能力以及使用工具函数的能力&#xff0c;能自主完成给定任务的计算机程序。 智能体的关键组成部分包括&#xff1a; 规划&#xff08;Planning&#xff09;&#xff1a;智能体能够将…

(二)、软硬件全开源智能手表,可全面高精度采集生命体征数据,进行健康检测。(HealthyPi Move)

HealthyPi Move是一款开放式硬件设备&#xff0c;可让您高精度地跟踪所有生命体征。它不仅仅是另一款带有心率监测器的智能手表&#xff0c;它还是手腕上的完整生命体征监测和记录设备&#xff0c;可以测量心电图(ECG)、光电容积脉搏波 (PPG)、SpO₂、血压(基于手指)、EDA/GSR、…

Clobotics 计算机视觉场景存储实践:多云架构、 POSIX 全兼容、低运维的统一存储

Clobotics 是一家将计算机视觉和机器学习技术应用于风电以及零售行业的企业。在风电行业&#xff0c;Clobotics 利用无人机对风力发电机叶片进行检查&#xff0c;显著降低了对人工作业的依赖。在零售领域&#xff0c;公司通过分析捕获的包装商品图像来提供基于实时数据的洞察&a…

Java-数据结构-ArrayLis与线性表 (๑╹◡╹)ノ“““

目录&#xff1a; 一、List的简单的介绍&#xff1a; 二、线性表&#xff1a; 三、顺序表&#xff1a; 1、基本代码&#xff1a; 2、操作代码&#xff1a; display()方法&#xff1a; add(int data)方法&#xff1a; add(int pos,int data)方法&#xff1a; contains(i…

大模型企业应用落地系列》基于大模型的对话式推荐系统》对话推荐系统技术架构

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 大模型企业应用落地系列全貌基于大模型的对话式推荐系统》技术架…

SpringWeb后端开发-登录认证

Author&#xff1a;Dawn_T17&#x1f965; 目录 登录功能 基础登录 登录校验 一、会话技术 1.基于 Cookie 和 Session 的传统会话技术(传统) 2.基于 Token 的会话技术&#xff08;如 JWT&#xff09;(主流)​ JWT 二、过滤器&#xff08;Filter&#xff09; 具体代…

《JavaEE进阶》----1.<JavaEE进阶可以学到什么>

本篇博客会讲到 一、JavaEE进阶学习内容&#xff1a; 1.框架的学习&#xff1a;Spring、Spring Boot、Spring MVC、MyBatis 2.大项目实践 3.源码阅读 二、JavaEE简介 B/S架构web开发流程 web前端开发&#xff08;了解&#xff09; web后端开发&#xff08;重点&#xff09; 三、…