新增题目同步到ES

news2024/11/16 6:59:10

文章目录

  • 🌞 Sun Frame:SpringBoot 的轻量级开发框架(个人开源项目推荐)
    • 🌟 亮点功能
    • 📦 spring cloud模块概览
      • 常用工具
    • 🔗 更多信息
    • 1.创建ES的索引和映射
        • 1.创建索引
        • 2.创建映射
    • 2.sun-club-infra 编写同步到ES的Service
        • 1.EsSubjectFields.java Es的字段映射常量类
        • 2.SubjectInfoEs.java Java中的映射实体类
        • 3.SubjectEsService.java
        • 4.SubjectEsServiceImpl.java
    • 3.添加题目时调用接口,同步到ES
        • 1.sun-club-common引入雪花Id工具类IdWorkerUtil.java
        • 2.sun-club-domain 修改SubjectInfoDomainServiceImpl.java的添加题目逻辑

🌞 Sun Frame:SpringBoot 的轻量级开发框架(个人开源项目推荐)

Sun Frame Banner

轻松高效的现代化开发体验

Sun Frame 是我个人开源的一款基于 SpringBoot 的轻量级框架,专为中小型企业设计。它提供了一种快速、简单且易于扩展的开发方式。

我们的开发文档记录了整个项目从0到1的任何细节,实属不易,请给我们一个Star!🌟
您的支持是我们持续改进的动力。

🌟 亮点功能

  • 组件化开发:灵活选择,简化流程。
  • 高性能:通过异步日志和 Redis 缓存提升性能。
  • 易扩展:支持多种数据库和消息队列。

📦 spring cloud模块概览

  • Nacos 服务:高效的服务注册与发现。
  • Feign 远程调用:简化服务间通信。
  • 强大网关:路由与限流。

常用工具

  • 日志管理:异步处理与链路追踪。
  • Redis 集成:支持分布式锁与缓存。
  • Swagger 文档:便捷的 API 入口。
  • 测试支持:SpringBoot-Test 集成。
  • EasyCode:自定义EasyCode模板引擎,一键生成CRUD。

🔗 更多信息

  • 开源地址:Gitee Sun Frame
  • 详细文档:语雀文档
    在这里插入图片描述

1.创建ES的索引和映射

1.创建索引

2.创建映射

2.sun-club-infra 编写同步到ES的Service

1.EsSubjectFields.java Es的字段映射常量类
package com.sunxiansheng.subject.infra.basic.entity;

/**
 * Description: 与ES关联的字段的常量类
 * @Author sun
 * @Create 2024/6/19 14:55
 * @Version 1.0
 */
public class EsSubjectFields {

    public static final String DOC_ID = "doc_id";

    public static final String SUBJECT_ID = "subject_id";

    public static final String SUBJECT_NAME = "subject_name";

    public static final String SUBJECT_ANSWER = "subject_answer";

    public static final String SUBJECT_TYPE = "subject_type";

    public static final String CREATE_USER = "create_user";

    public static final String CREATE_TIME = "create_time";

    // 请求字段数组
    public static final String[] FIELD_QUERY = {
            SUBJECT_ID, SUBJECT_NAME, SUBJECT_ANSWER, SUBJECT_TYPE, DOC_ID, CREATE_USER, CREATE_TIME
    };

}
2.SubjectInfoEs.java Java中的映射实体类
package com.sunxiansheng.subject.infra.basic.entity;

import com.sunxiansheng.subject.common.eneity.PageInfo;
import lombok.Data;

import java.io.Serializable;
import java.math.BigDecimal;

/**
 * Description: ES题目实体类
 * @Author sun
 * @Create 2024/6/19 14:47
 * @Version 1.0
 */
@Data
public class SubjectInfoEs extends PageInfo implements Serializable {

    private Long subjectId;

    private Long docId;

    private String subjectName;

    private String subjectAnswer;

    private String createUser;

    private Long createTime;

    private Integer subjectType;

    private String keyWord;

    private BigDecimal score;

}
3.SubjectEsService.java
package com.sunxiansheng.subject.infra.basic.service;

import com.sunxiansheng.subject.common.eneity.PageResult;
import com.sunxiansheng.subject.infra.basic.entity.SubjectInfoEs;

/**
 * Description:题目ES接口
 * @Author sun
 * @Create 2024/6/19 15:06
 * @Version 1.0
 */
public interface SubjectEsService {

    /**
     * 插入一条记录
     * @param subjectInfoEs
     * @return
     */
    boolean insert(SubjectInfoEs subjectInfoEs);

    /**
     * ES分页查询
     * @param subjectInfoEs
     * @return
     */
    PageResult<SubjectInfoEs> querySubjectList(SubjectInfoEs subjectInfoEs);

}
4.SubjectEsServiceImpl.java
package com.sunxiansheng.subject.infra.basic.service.impl;

import com.sunxiansheng.subject.common.eneity.PageResult;
import com.sunxiansheng.subject.infra.basic.entity.EsSubjectFields;
import com.sunxiansheng.subject.infra.basic.entity.SubjectInfoEs;
import com.sunxiansheng.subject.infra.basic.es.EsIndexInfo;
import com.sunxiansheng.subject.infra.basic.es.EsRestClient;
import com.sunxiansheng.subject.infra.basic.es.EsSourceData;
import com.sunxiansheng.subject.infra.basic.service.SubjectEsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * Description:
 * @Author sun
 * @Create 2024/6/19 15:10
 * @Version 1.0
 */
@Service
@Slf4j
public class SubjectEsServiceImpl implements SubjectEsService {

    @Override
    public boolean insert(SubjectInfoEs subjectInfoEs) {
        // 创建一个es源数据对象,内部包含文档id和数据,使用这个对象将数据插入到es
        EsSourceData esSourceData = new EsSourceData();
        // 将要插入的信息转换为map,要对应于es的字段名
        Map<String, Object> data = convert2EsSourceData(subjectInfoEs);
        // 将信息放到es数据源对象
        esSourceData.setDocId(subjectInfoEs.getDocId().toString());
        esSourceData.setData(data);
        // 插入,根据集群名、索引名、源数据插入
        return EsRestClient.insertDoc(getEsIndexInfo(), esSourceData);
    }

    /**
     * 将SubjectInfoEs转换为Map<String, Object>
     * @param subjectInfoEs
     * @return
     */
    private Map<String, Object> convert2EsSourceData(SubjectInfoEs subjectInfoEs) {
        Long subjectId = subjectInfoEs.getSubjectId();
        Long docId = subjectInfoEs.getDocId();
        String subjectName = subjectInfoEs.getSubjectName();
        String subjectAnswer = subjectInfoEs.getSubjectAnswer();
        String createUser = subjectInfoEs.getCreateUser();
        Long createTime = subjectInfoEs.getCreateTime();

        // 创建一个map,将数据放入map,注意这里的key要和es的字段名一致
        Map<String, Object> esSourceData = new HashMap<>();
        esSourceData.put(EsSubjectFields.SUBJECT_ID, subjectId);
        esSourceData.put(EsSubjectFields.DOC_ID, docId);
        esSourceData.put(EsSubjectFields.SUBJECT_NAME, subjectName);
        esSourceData.put(EsSubjectFields.SUBJECT_ANSWER, subjectAnswer);
        esSourceData.put(EsSubjectFields.CREATE_USER, createUser);
        esSourceData.put(EsSubjectFields.CREATE_TIME, createTime);

        return esSourceData;
    }

    /**
     * 获取集群名和索引名
     * @return
     */
    private EsIndexInfo getEsIndexInfo() {
        EsIndexInfo esIndexInfo = new EsIndexInfo();
        // 设置索引
        esIndexInfo.setIndexName("subject_index");
        // 设置集群名
        esIndexInfo.setClusterName("98bd89b5ccaf");
        return esIndexInfo;
    }

    @Override
    public PageResult<SubjectInfoEs> querySubjectList(SubjectInfoEs subjectInfoEs) {
        return null;
    }

}

3.添加题目时调用接口,同步到ES

1.sun-club-common引入雪花Id工具类IdWorkerUtil.java
package com.sunxiansheng.subject.common.util;

public class IdWorkerUtil {

    private long workerId;

    private long datacenterId;

    private long sequence;

    private long twepoch = 1585644268888L;

    private long workerIdBits = 5L;

    private long datacenterIdBits = 5L;

    private long sequenceBits = 12L;

    private long maxWorkerId = -1L ^ (-1L << workerIdBits);

    private long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);

    private long workerIdShift = sequenceBits;

    private long datacenterIdShift = sequenceBits + workerIdBits;

    private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;

    private long sequenceMask = -1L ^ (-1L << sequenceBits);

    private long lastTimestamp = -1L;

    public long getWorkerId() {
        return workerId;
    }

    public long getDatacenterId() {
        return datacenterId;
    }

    public long getTimestamp() {
        return System.currentTimeMillis();
    }

    public IdWorkerUtil(long workerId, long datacenterId, long sequence) {
        if (workerId > maxWorkerId || workerId < 0) {
            throw new IllegalArgumentException(
                    String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
        }
        if (datacenterId > maxDatacenterId || datacenterId < 0) {

            throw new IllegalArgumentException(
                    String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
        }
        this.workerId = workerId;
        this.datacenterId = datacenterId;
        this.sequence = sequence;
    }

    public synchronized long nextId() {
        long timestamp = timeGen();
        if (timestamp < lastTimestamp) {
            System.err.printf(
                    "clock is moving backwards. Rejecting requests until %d.", lastTimestamp);
            throw new RuntimeException(
                    String.format("Clock moved backwards. Refusing to generate id for %d milliseconds",
                            lastTimestamp - timestamp));
        }

        if (lastTimestamp == timestamp) {

            sequence = (sequence + 1) & sequenceMask;
            if (sequence == 0) {
                timestamp = tilNextMillis(lastTimestamp);
            }

        } else {
            sequence = 0;
        }
        lastTimestamp = timestamp;
        return ((timestamp - twepoch) << timestampLeftShift) |
                (datacenterId << datacenterIdShift) |
                (workerId << workerIdShift) | sequence;
    }

    private long tilNextMillis(long lastTimestamp) {
        long timestamp = timeGen();
        while (timestamp <= lastTimestamp) {
            timestamp = timeGen();
        }
        return timestamp;
    }

    //获取当前时间戳
    private long timeGen() {
        return System.currentTimeMillis();
    }

}
2.sun-club-domain 修改SubjectInfoDomainServiceImpl.java的添加题目逻辑

image-20240619161715468

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

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

相关文章

C语言 ——— 学习、使用memmove函数 并模拟实现

目录 memmvoe函数的功能 学习memmove函数​编辑 模拟实现memmove函数 memmvoe函数的功能 memmvoe函数的功能类似于memcpy函数&#xff0c;都是内存拷贝&#xff0c;唯一的区别是memcpy函数不能成功拷贝原数据&#xff0c;而memmvoe函数可以 举例来说&#xff1a; [1, 2, 3…

【Material-UI】Checkbox 组件自定义详解

文章目录 一、Checkbox 组件概述1. 组件介绍2. 基本用法 二、Checkbox 组件的基本自定义1. 更改复选框的颜色2. 调整复选框的大小 三、Checkbox 组件的高级自定义1. 自定义图标2. 自定义复选框的边框和形状 四、使用主题进行全局自定义1. 定义全局主题2. 动态主题切换 五、总结…

springboot整合springmvc使用外置的Servlet容器

目录 1. 创建2. 配置3. 配置Tomcat4. 心得 1. 创建 2. 配置 首先创建两个文件夹 配置&#xff1a; 3. 配置Tomcat 右上角的按钮 添加 保证这几个不冲突&#xff0c;保证你的tomcat的文件没问题&#xff01;&#xff01;&#xff01; 点击部署 选择第二个war exploded…

零基础5分钟上手谷歌云GCP核心云开发技能 - 搭建和维护高可用数据库集群

简介&#xff1a; 欢迎来到小李哥全新谷歌云GCP云计算知识学习系列&#xff0c;适用于任何无云计算或者谷歌云技术背景的开发者&#xff0c;让大家零基础5分钟通过这篇文章就能完全学会谷歌云一个经典的服务开发架构方案。 我将每天介绍一个基于全球三大云计算平台&#xff0…

GPT解逻辑数学题之8个8变1000的故事

目录 初试正解 我&#xff1a; GPT4&#xff1a; 再问思索 我&#xff1a; GPT4&#xff1a; 提醒错误 我&#xff1a; GPT4&#xff1a; 给出正解提示 我&#xff1a; GPT4&#xff1a; 不愿放弃 我&#xff1a; GPT4&#xff1a; 再次尝试 我&#xff1a; …

Web开发:web服务器-Nginx的基础介绍(含AI文稿)

目录 一、Nginx的功能&#xff1a; 二、正向代理和反向代理的区别 三、Nginx负载均衡的主要功能 四、nginx安装目录下的各个文件&#xff08;夹&#xff09;的作用&#xff1a; 五、常用命令 一、Nginx的功能&#xff1a; 1.反向代理&#xff1a;例如我有三台服务器&#x…

Linux源码阅读笔记20-PCI设备驱动详解

PCI基础 PCI总线为高性能局部总线&#xff0c;主要解决外部设备之间以及外部设备与主机之间高速数据传输。在数字图形、图像等处理&#xff0c;以及告诉实时数据采集与处理等队数据传输速率要求高的应用中&#xff0c;采用PCI总线进行数据传输。PCI规范能够实现32位并行数据传…

我在高职教STM32——I2C通信入门(3)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助CSDN平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课件分…

STM32G070KBT6的RTC HAL库使用

*配置问题 首先使能时钟源&#xff0c;这里在时钟配置中选择LSI&#xff0c;为什么后面会说&#xff0c;然后使能Calender结构体&#xff0c;保证可以对RTC的年月日时分秒等进行写入和读取&#xff1b;alarmA和alarmB是闹钟&#xff0c;这里不用就Disable&#xff1b; Tam…

突破•指针六

听说这是目录哦 数组和指针笔试题解析&#x1fae7;一维数组1&#x1f355;&#x1f355;&#x1f355;&#x1f355;&#x1f355;&#x1f355;&#x1f355; 字符数组1&#x1f354;&#x1f354;&#x1f354;&#x1f354;&#x1f354;&#x1f354;&#x1f354;2&#…

高并发下的分布式缓存 | Read-Through缓存模式

缓存系列文章链接如下&#xff1a; 高并发下的分布式缓存 | 缓存系统稳定性设计 高并发下的分布式缓存 | 设计和实现LRU缓存 高并发下的分布式缓存 | 设计和实现LFU缓存 高并发下的分布式缓存 | Cache-Aside缓存模式 Read-Through 模式的缓存操作 Read-Through模式的一个关键…

Scanner类、String类和StringBuffer类的相关使用

一、Scanner: 主要用于键盘录入的 构造方法&#xff1a; Scanner(InputStream source) 构造一个新的 Scanner &#xff0c;产生从指定输入流扫描的值。 1、next()和nextLine()区别&#xff1a; String line sc.next(); // 不会接收特殊字符&#xff0c;比如空格回…

高效的编程学习方法和技巧

编程小白如何成为大神&#xff1f;大学新生的最佳入门攻略 编程已成为当代大学生的必备技能&#xff0c;但面对众多编程语言和学习资源&#xff0c;新生们常常感到迷茫。如何选择适合自己的编程语言&#xff1f;如何制定有效的学习计划&#xff1f;如何避免常见的学习陷阱&…

基于单片机的智能空气净化系统

【摘 要】 设计了一种基于单片机的智能空气净化系统。通过传感器实时采集空气中 PM2.5 、甲醛等有害健康物质的浓度&#xff0c;将各项数据显示到液晶显示屏&#xff0c;当浓度超过设置的警戒值时&#xff0c;控制蜂鸣器发出警报。根据浓度大小控制空气净化器电机转速&#xf…

04.C++类和对象(中)

1.类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。一个类&#xff0c;我们不写的情况下编译器会默认生成以下6个默认成员函数&#xff0c;需要注意的是这6个中最重要的是前4个&#xff0c;最后两个取地址重载不重…

Selenium + Python 自动化测试04(操作方法1)

上一篇我们讲述了webdriver 元素定位方法。我们对如何定位元素有了一个基本的认识。接着我们详细讲述对元素常见的一些基本操作方法&#xff0c;以便我们可以做很多功能操作的测试。这一篇侧重最基本的操作方面。 1、send_keys 方法 此方法类似于模拟键盘输入。还是以下面网站…

React项目中引用视频播出插件 easyPlayer.js 部署趟坑日志

目录 前文记录背景问题摸排&#xff1a;第一天前端打包失败&#xff1f;远程打包逻辑与本地打包逻辑不一致&#xff1f;远程入口页被篡改&#xff1f;再次排查本地webpack打包逻辑 问题摸排&#xff1a;第二天确认本地与远程打包一致排查远程nginx代理定位问题 index.html 的所…

AI10-PaddleDetection2.7安装测试

1、下载PaddleDetect-release-2.7开源项目 https://github.com/PaddlePaddle/PaddleDetection https://github.com/PaddlePaddle/PaddleDetection/releases PaddleDetection: PaddleDetection的目的是为工业界和学术界提供丰富、易用的目标检测模型 2、安装 环境要求 * Paddl…

[Qt][QWidget]详细讲解

目录 1.概述2.QWidget核心属性1.简介2.核心属性概览 3.QWidget常用属性1.enabled2.geometry1.是什么&#xff1f;2.Window Frame的影响3.相关API4.注意 3.windowTitile4.windowIcon5.windowOpacity6.cursor8.font9.toolTip10.focusPolicy11.styleSheet 1.概述 Widget是Qt中的核…

2024新版ChatGPT系统源码SparkAi系统,支持GPT4.0全模型,AI绘画,AI换脸+自定义智能体GPTs应用+AI视频+文档分析

一、文章序言 人工智能技术正迅猛发展&#xff0c;AI语言模型、AI绘画和AI视频已经在许多领域得到广泛应用。这些技术不仅在科技创新方面表现出色&#xff0c;还在艺术创作、内容生成和商业应用中展现出巨大的潜力。 SparkAi创作系统是一款基于ChatGPT和Midjourney开发的智能…