Tio Boot DocsTio Boot Docs
Home
  • java-db
  • api-table
  • Enjoy
  • Tio Boot Admin
  • ai_agent
  • translator
  • knowlege_base
  • ai-search
  • 案例
Abount
  • Github
  • Gitee
Home
  • java-db
  • api-table
  • Enjoy
  • Tio Boot Admin
  • ai_agent
  • translator
  • knowlege_base
  • ai-search
  • 案例
Abount
  • Github
  • Gitee
  • 01_tio-boot 简介

    • tio-boot:新一代高性能 Java Web 开发框架
    • tio-boot 入门示例
    • Tio-Boot 配置 : 现代化的配置方案
    • tio-boot 整合 Logback
    • tio-boot 整合 hotswap-classloader 实现热加载
    • 自行编译 tio-boot
    • 最新版本
    • 开发规范
  • 02_部署

    • 使用 Maven Profile 实现分环境打包 tio-boot 项目
    • Maven 项目配置详解:依赖与 Profiles 配置
    • tio-boot 打包成 FastJar
    • 使用 GraalVM 构建 tio-boot Native 程序
    • 使用 Docker 部署 tio-boot
    • 部署到 Fly.io
    • 部署到 AWS Lambda
    • 到阿里云云函数
    • 使用 Deploy 工具部署
    • 胖包与瘦包的打包与部署
    • 使用 Jenkins 部署 Tio-Boot 项目
    • 使用 Nginx 反向代理 Tio-Boot
    • 使用 Supervisor 管理 Java 应用
  • 03_配置

    • 配置参数
    • 服务器监听器
    • 内置缓存系统 AbsCache
    • 使用 Redis 作为内部 Cache
    • 静态文件处理器
    • 基于域名的静态资源隔离
    • DecodeExceptionHandler
  • 04_原理

    • 生命周期
    • 请求处理流程
    • 重要的类
  • 05_json

    • Json
    • 接受 JSON 和响应 JSON
    • 响应实体类
  • 06_web

    • 概述
    • 文件上传
    • 接收请求参数
    • 接收日期参数
    • 接收数组参数
    • 返回字符串
    • 返回文本数据
    • 返回网页
    • 请求和响应字节
    • 文件下载
    • 返回视频文件并支持断点续传
    • http Session
    • Cookie
    • HttpRequest
    • HttpResponse
    • Resps
    • RespBodyVo
    • /zh/06_web/19.html
    • 全局异常处理器
    • 异步
    • 动态 返回 CSS 实现
    • 返回图片
    • Transfer-Encoding: chunked 实时音频播放
    • Server-Sent Events (SSE)
    • 接口访问统计
    • 接口请求和响应数据记录
    • 自定义 Handler 转发请求
    • 使用 HttpForwardHandler 转发所有请求
    • 跨域
    • 添加 Controller
    • 常用工具类
    • HTTP Basic 认证
    • WebJars
    • JProtobuf
  • 07_validate

    • 数据紧校验规范
    • 参数校验
  • 08_websocket

    • 使用 tio-boot 搭建 WebSocket 服务
    • WebSocket 聊天室项目示例
  • 09_java-db

    • java‑db
    • 操作数据库入门示例
    • SQL 模板
    • 数据源配置与使用
    • ActiveRecord
    • Model
    • 生成器与 Model
    • Db 工具类
    • 批量操作
    • 数据库事务处理
    • Cache 缓存
    • Dialect 多数据库支持
    • 表关联操作
    • 复合主键
    • Oracle 支持
    • Enjoy SQL 模板
    • Java-DB 整合 Enjoy 模板最佳实践
    • 多数据源支持
    • 独立使用 ActiveRecord
    • 调用存储过程
    • java-db 整合 Guava 的 Striped 锁优化
    • 生成 SQL
    • 通过实体类操作数据库
    • java-db 读写分离
    • Spring Boot 整合 Java-DB
    • like 查询
    • 常用操作示例
    • Druid 监控集成指南
    • SQL 统计
  • 10_api-table

    • ApiTable 概述
    • 使用 ApiTable 连接 SQLite
    • 使用 ApiTable 连接 Mysql
    • 使用 ApiTable 连接 Postgres
    • 使用 ApiTable 连接 TDEngine
    • 使用 api-table 连接 oracle
    • 使用 api-table 连接 mysql and tdengine 多数据源
    • EasyExcel 导出
    • EasyExcel 导入
    • TQL(Table SQL)前端输入规范
    • ApiTable 实现增删改查
    • 数组类型
    • 单独使用 ApiTable
  • 11_aop

    • JFinal-aop
    • Aop 工具类
    • 配置
    • 配置
    • 独立使用 JFinal Aop
    • @AImport
    • 原理解析
  • 12_cache

    • Caffine
    • Jedis-redis
    • hutool RedisDS
    • Redisson
    • Caffeine and redis
    • CacheUtils 工具类
    • 使用 CacheUtils 整合 caffeine 和 redis 实现的两级缓存
    • 使用 java-db 整合 ehcache
    • 使用 java-db 整合 redis
    • Java DB Redis 相关 Api
    • redis 使用示例
  • 13_认证和权限

    • hutool-JWT
    • FixedTokenInterceptor
    • 使用内置 TokenManager 实现登录
    • 用户系统
    • 重置密码
    • 匿名登录
    • Google 登录
    • 权限校验注解
    • Sa-Token
    • sa-token 登录注册
    • StpUtil.isLogin() 源码解析
    • 短信登录
    • 移动端微信登录实现指南
    • 移动端重置密码
  • 14_i18n

    • i18n
  • 15_enjoy

    • tio-boot 整合 Enjoy 模版引擎文档
    • 引擎配置
    • 表达式
    • 指令
    • 注释
    • 原样输出
    • Shared Method 扩展
    • Shared Object 扩展
    • Extension Method 扩展
    • Spring boot 整合
    • 独立使用 Enjoy
    • tio-boot enjoy 自定义指令 localeDate
    • PromptEngine
    • Enjoy 入门示例-擎渲染大模型请求体
    • Enjoy 使用示例
  • 16_定时任务

    • Quartz 定时任务集成指南
    • 分布式定时任务 xxl-jb
    • cron4j 使用指南
  • 17_tests

    • TioBootTest 类
  • 18_tio

    • TioBootServer
    • tio-core
    • 内置 TCP 处理器
    • 独立启动 UDPServer
    • 使用内置 UDPServer
    • t-io 消息处理流程
    • tio-运行原理详解
    • TioConfig
    • ChannelContext
    • Tio 工具类
    • 业务数据绑定
    • 业务数据解绑
    • 发送数据
    • 关闭连接
    • Packet
    • 监控: 心跳
    • 监控: 客户端的流量数据
    • 监控: 单条 TCP 连接的流量数据
    • 监控: 端口的流量数据
    • 单条通道统计: ChannelStat
    • 所有通道统计: GroupStat
    • 资源共享
    • 成员排序
    • ssl
    • DecodeRunnable
    • 使用 AsynchronousSocketChannel 响应数据
    • 拉黑 IP
    • 深入解析 Tio 源码:构建高性能 Java 网络应用
  • 19_aio

    • ByteBuffer
    • AIO HTTP 服务器
    • 自定义和线程池和池化 ByteBuffer
    • AioHttpServer 应用示例 IP 属地查询
    • 手写 AIO Http 服务器
  • 20_netty

    • Netty TCP Server
    • Netty Web Socket Server
    • 使用 protoc 生成 Java 包文件
    • Netty WebSocket Server 二进制数据传输
    • Netty 组件详解
  • 21_netty-boot

    • Netty-Boot
    • 原理解析
    • 整合 Hot Reload
    • 整合 数据库
    • 整合 Redis
    • 整合 Elasticsearch
    • 整合 Dubbo
    • Listener
    • 文件上传
    • 拦截器
    • Spring Boot 整合 Netty-Boot
    • SSL 配置指南
    • ChannelInitializer
    • Reserve
  • 22_MQ

    • Mica-mqtt
    • EMQX
    • Disruptor
  • 23_tio-utils

    • tio-utils
    • HttpUtils
    • Notification
    • 邮箱
    • JSON
    • 读取文件
    • Base64
    • 上传和下载
    • Http
    • Telegram
    • RsaUtils
    • EnvUtils 使用文档
    • 系统监控
    • 毫秒并发 ID (MCID) 生成方案
  • 24_tio-http-server

    • 使用 Tio-Http-Server 搭建简单的 HTTP 服务
    • tio-boot 添加 HttpRequestHandler
    • 在 Android 上使用 tio-boot 运行 HTTP 服务
    • tio-http-server-native
    • handler 常用操作
  • 25_tio-websocket

    • WebSocket 服务器
    • WebSocket Client
  • 26_tio-im

    • 通讯协议文档
    • ChatPacket.proto 文档
    • java protobuf
    • 数据表设计
    • 创建工程
    • 登录
    • 历史消息
    • 发消息
  • 27_mybatis

    • Tio-Boot 整合 MyBatis
    • 使用配置类方式整合 MyBatis
    • 整合数据源
    • 使用 mybatis-plus 整合 tdengine
    • 整合 mybatis-plus
  • 28_mongodb

    • tio-boot 使用 mongo-java-driver 操作 mongodb
  • 29_elastic-search

    • Elasticsearch
    • JavaDB 整合 ElasticSearch
    • Elastic 工具类使用指南
    • Elastic-search 注意事项
    • ES 课程示例文档
      • 表结构和数据
      • Elasticsearch 索引创建、数据导入和搜索
        • 1. 创建 Elasticsearch 索引
        • 2. 导入数据库记录到 Elasticsearch
        • 3. 在 Elasticsearch 中搜索课程数据
        • BoolQueryBuilder 和 sourceBuilder 的作用
        • 为什么需要 BoolQueryBuilder 和 sourceBuilder?
        • 4.删除索引
        • 具体工作流程
        • 测试
  • 30_magic-script

    • tio-boot 整合 magic-script
  • 31_groovy

    • tio-boot 整合 Groovy
  • 32_firebase

    • 整合 google firebase
    • Firebase Storage
    • Firebase Authentication
    • 使用 Firebase Admin SDK 进行匿名用户管理与自定义状态标记
    • 导出用户
    • 注册回调
    • 登录注册
  • 33_文件存储

    • 文件上传数据表
    • 本地存储
    • 使用 AWS S3 存储文件并整合到 Tio-Boot 项目中
    • 存储文件到 腾讯 COS
  • 34_spider

    • jsoup
    • 爬取 z-lib.io 数据
    • 整合 WebMagic
    • WebMagic 示例:爬取学校课程数据
    • Playwright
    • Flexmark (Markdown 处理器)
    • tio-boot 整合 Playwright
    • 缓存网页数据
  • 36_integration_thirty_party

    • tio-boot 整合 okhttp
    • 整合 GrpahQL
    • 集成 Mailjet
    • 整合 ip2region
    • 整合 GeoLite 离线库
    • 整合 Lark 机器人指南
    • 集成 Lark Mail 实现邮件发送
    • Thymeleaf
    • Swagger
    • Clerk 验证
  • 37_dubbo

    • 概述
    • dubbo 2.6.0
    • dubbo 2.6.0 调用过程
    • dubbo 3.2.0
  • 38_spring

    • Spring Boot Web 整合 Tio Boot
    • spring-boot-starter-webflux 整合 tio-boot
    • Tio Boot 整合 Spring Boot Starter
    • Tio Boot 整合 Spring Boot Starter Data Redis 指南
  • 39_spring-cloud

    • tio-boot spring-cloud
  • 40_mysql

    • 使用 Docker 运行 MySQL
    • /zh/42_mysql/02.html
  • 41_postgresql

    • PostgreSQL 安装
    • PostgreSQL 主键自增
    • PostgreSQL 日期类型
    • Postgresql 金融类型
    • PostgreSQL 数组类型
    • PostgreSQL 全文检索
    • PostgreSQL 查询优化
    • 获取字段类型
    • PostgreSQL 向量
    • PostgreSQL 优化向量查询
    • PostgreSQL 其他
  • 43_oceanbase

    • 快速体验 OceanBase 社区版
    • 快速上手 OceanBase 数据库单机部署与管理
    • 诊断集群性能
    • 优化 SQL 性能指南
    • /zh/43_oceanbase/05.html
  • 50_media

    • JAVE 提取视频中的声音
    • Jave 提取视频中的图片
    • /zh/50_media/03.html
  • 51_asr

    • Whisper-JNI
  • 54_native-media

    • java-native-media
    • JNI 入门示例
    • mp3 拆分
    • mp4 转 mp3
    • 使用 libmp3lame 实现高质量 MP3 编码
    • Linux 编译
    • macOS 编译
    • 从 JAR 包中加载本地库文件
    • 支持的音频和视频格式
    • 任意格式转为 mp3
    • 通用格式转换
    • 通用格式拆分
    • 视频合并
    • VideoToHLS
    • split_video_to_hls 支持其他语言
    • 持久化 HLS 会话
  • 55_telegram4j

    • 数据库设计
    • /zh/55_telegram4j/02.html
    • 基于 MTProto 协议开发 Telegram 翻译机器人
    • 过滤旧消息
    • 保存机器人消息
    • 定时推送
    • 增加命令菜单
    • 使用 telegram-Client
    • 使用自定义 StoreLayout
    • 延迟测试
    • Reactor 错误处理
    • Telegram4J 常见错误处理指南
  • 56_telegram-bots

    • TelegramBots 入门指南
    • 使用工具库 telegram-bot-base 开发翻译机器人
  • 60_LLM

    • 简介
    • AI 问答
    • /zh/60_LLM/03.html
    • /zh/60_LLM/04.html
    • 增强检索(RAG)
    • 结构化数据检索
    • 搜索+AI
    • 集成第三方 API
    • 后置处理
    • 推荐问题生成
    • 连接代码执行器
    • 避免 GPT 混乱
    • /zh/60_LLM/13.html
  • 61_ai_agent

    • 数据库设计
    • 示例问题管理
    • 会话管理
    • 历史记录
    • 对接 Perplexity API
    • 意图识别与生成提示词
    • 智能问答模块设计与实现
    • 文件上传与解析文档
    • 翻译
    • 名人搜索功能实现
    • Ai studio gemini youbue 问答使用说明
    • 自建 YouTube 字幕问答系统
    • 自建 获取 youtube 字幕服务
    • 通用搜索
    • /zh/61_ai_agent/15.html
    • 16
    • 17
    • 18
    • 在 tio-boot 应用中整合 ai-agent
    • 16
  • 62_translator

    • 简介
  • 63_knowlege_base

    • 数据库设计
    • 用户登录实现
    • 模型管理
    • 知识库管理
    • 文档拆分
    • 片段向量
    • 命中测试
    • 文档管理
    • 片段管理
    • 问题管理
    • 应用管理
    • 向量检索
    • 推理问答
    • 问答模块
    • 统计分析
    • 用户管理
    • api 管理
    • 存储文件到 S3
    • 文档解析优化
    • 片段汇总
    • 段落分块与检索
    • 多文档解析
    • 对话日志
    • 检索性能优化
    • Milvus
    • 文档解析方案和费用对比
    • 离线运行向量模型
  • 64_ai-search

    • ai-search 项目简介
    • ai-search 数据库文档
    • ai-search SearxNG 搜索引擎
    • ai-search Jina Reader API
    • ai-search Jina Search API
    • ai-search 搜索、重排与读取内容
    • ai-search PDF 文件处理
    • ai-search 推理问答
    • Google Custom Search JSON API
    • ai-search 意图识别
    • ai-search 问题重写
    • ai-search 系统 API 接口 WebSocket 版本
    • ai-search 搜索代码实现 WebSocket 版本
    • ai-search 生成建议问
    • ai-search 生成问题标题
    • ai-search 历史记录
    • Discover API
    • 翻译
    • Tavily Search API 文档
    • 对接 Tavily Search
    • 火山引擎 DeepSeek
    • 对接 火山引擎 DeepSeek
    • ai-search 搜索代码实现 SSE 版本
    • jar 包部署
    • Docker 部署
    • 爬取一个静态网站的所有数据
    • 网页数据预处理
    • 网页数据检索与问答流程整合
  • 65_java-linux

    • Java 执行 python 代码
    • 通过大模型执行 Python 代码
    • MCP 协议
    • Cline 提示词
    • Cline 提示词-中文版本
  • 66_manim

    • Manim 开发环境搭建
    • 生成场景提示词
    • 生成代码
    • 完整脚本示例
    • 语音合成系统
    • Fish.audio TTS 接口说明文档与 Java 客户端封装
    • 整合 fishaudio 到 java-uni-ai-server 项目
    • 执行 Python (Manim) 代码
    • 使用 SSE 流式传输生成进度的实现文档
    • 整合全流程完整文档
    • HLS 动态推流技术文档
    • manim 分场景生成代码
    • 分场景运行代码及流式播放支持
    • 分场景业务端完整实现流程
    • Maiim布局管理器
    • 仅仅生成场景代码
    • 使用 modal 运行 manim 代码
    • Python 使用 Modal GPU 加速渲染
    • Modal 平台 GPU 环境下运行 Manim
    • Modal Manim OpenGL 安装与使用
    • 优化 GPU 加速
    • 生成视频封面流程
    • Java 调用 manim 命令 执行代码 生成封面
    • Manim 图像生成服务客户端文档
    • /zh/66_manim/25.html
    • /zh/66_manim/26.html
    • /zh/66_manim/27.html
  • 70_tio-boot-admin

    • 入门指南
    • 初始化数据
    • token 存储
    • 与前端集成
    • 文件上传
    • 网络请求
    • 图片管理
    • /zh/70_tio-boot-admin/08.html
    • Word 管理
    • PDF 管理
    • 文章管理
    • 富文本编辑器
  • 71_tio-boot

    • /zh/71_tio-boot/01.html
    • Swagger 整合到 Tio-Boot 中的指南
    • HTTP/1.1 Pipelining 性能测试报告
  • 80_性能测试

    • 压力测试 - tio-http-serer
    • 压力测试 - tio-boot
    • 压力测试 - tio-boot-native
    • 压力测试 - netty-boot
    • 性能测试对比
    • TechEmpower FrameworkBenchmarks
    • 压力测试 - tio-boot 12 C 32G
  • 99_案例

    • 封装 IP 查询服务
    • tio-boot 案例 - 全局异常捕获与企业微信群通知
    • tio-boot 案例 - 文件上传和下载
    • tio-boot 案例 - 整合 ant design pro 增删改查
    • tio-boot 案例 - 流失响应
    • tio-boot 案例 - 增强检索
    • tio-boot 案例 - 整合 function call
    • tio-boot 案例 - 定时任务 监控 PostgreSQL、Redis 和 Elasticsearch
    • Tio-Boot 案例:使用 SQLite 整合到登录注册系统
    • tio-boot 案例 - 执行 shell 命令

ES 课程示例文档

在将关系数据库中的数据导入 Elasticsearch 以实现高效搜索的过程中,本文展示了如何使用 Java 集成 PostgreSQL 和 Elasticsearch。通过创建索引、批量导入数据、以及构建复杂查询,我们能够实现对大量课程数据的快速检索和分析。此方法不仅提高了数据查询的效率,还为用户提供了更为灵活的搜索功能,适用于需要处理大规模数据集的应用场景。

表结构和数据

首先,我们创建一个 PostgreSQL 表 rumi_sjsu_class_schedule_2024_fall 来存储 2024 年秋季学期的课程信息。以下是该表的结构定义:

DROP TABLE IF EXISTS "public"."rumi_sjsu_class_schedule_2024_fall";
CREATE TABLE "public"."rumi_sjsu_class_schedule_2024_fall" (
  "id" "pg_catalog"."int8" NOT NULL,
  "term" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "section" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "section_url" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "class_number" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "mode_of_instruction" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "course_title" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "satisfies" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "units" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "type" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "days" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "times" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "instructor" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "instructor_email" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "location" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "dates" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "open_seats" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "notes" "pg_catalog"."text" COLLATE "pg_catalog"."default",
  "source_url" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "remark" "pg_catalog"."varchar" COLLATE "pg_catalog"."default",
  "creator" "pg_catalog"."varchar" COLLATE "pg_catalog"."default" DEFAULT ''::character varying,
  "create_time" "pg_catalog"."timestamp" NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "updater" "pg_catalog"."varchar" COLLATE "pg_catalog"."default" DEFAULT ''::character varying,
  "update_time" "pg_catalog"."timestamp" NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "deleted" "pg_catalog"."int2" NOT NULL DEFAULT 0,
  "tenant_id" "pg_catalog"."int8" NOT NULL DEFAULT 0
);

接下来,向该表中插入 10 条样例数据:

INSERT INTO "public"."rumi_sjsu_class_schedule_2024_fall" VALUES (415453123425030148, 'Fall 2024', 'AAS 1 (Section 07)', 'https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=1&cur_cat_oid=15&navoid=5382', '47613', 'In Person', 'Introduction to Asian American Studies', 'GE: F', '3.0', 'LEC', 'TR', '01:30PM-02:45PM', 'Lawrence Lan', 'mailto:lawrence.lan@sjsu.edu', 'HGH122', '08/21/24-12/09/24', '0', '', 'https://www.sjsu.edu/classes/schedules/fall-2024.php', NULL, '', '2024-08-20 13:23:10.434585', '', '2024-08-20 13:23:10.434585', 0, 0);
INSERT INTO "public"."rumi_sjsu_class_schedule_2024_fall" VALUES (415453123429224456, 'Fall 2024', 'AAS 25 (Section 04)', 'https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=25&cur_cat_oid=15&navoid=5382', '49445', 'Fully Online', 'The Changing Majority: Power and Ethnicity in America', 'GE: F', '3.0', 'LEC', 'TBA', 'TBA', 'Bobby Seals', 'mailto:bobby.m.seals@sjsu.edu', 'ONLINE', '08/21/24-12/09/24', '26', 'FULLY ONLINE - NO designated day/time meetings (TBA). May utilize Canvas. More info at sjsu.edu/ecampus', 'https://www.sjsu.edu/classes/schedules/fall-2024.php', NULL, '', '2024-08-20 13:23:10.434585', '', '2024-08-20 13:23:10.434585', 0, 0);
INSERT INTO "public"."rumi_sjsu_class_schedule_2024_fall" VALUES (415453123433418757, 'Fall 2024', 'AAS 33A (Section 05)', 'https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=33A&cur_cat_oid=15&navoid=5382', '47647', 'In Person', 'Asian Americans in U.S. History I', 'GE: D', '3.0', 'LEC', 'TR', '03:00PM-04:15PM', 'Lawrence Lan', 'mailto:lawrence.lan@sjsu.edu', 'HGH122', '08/21/24-12/09/24', '0', '', 'https://www.sjsu.edu/classes/schedules/fall-2024.php', NULL, '', '2024-08-20 13:23:10.434585', '', '2024-08-20 13:23:10.434585', 0, 0);
INSERT INTO "public"."rumi_sjsu_class_schedule_2024_fall" VALUES (415453123433418763, 'Fall 2024', 'AAS 33B (Section 02)', 'https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=33B&cur_cat_oid=15&navoid=5382', '47661', 'In Person', 'Asian Americans in U.S. History II', 'GE: D+US', '3.0', 'LEC', 'MW', '04:30PM-05:45PM', 'Soo Choi', 'mailto:soo.choi@sjsu.edu', 'DMH358', '08/21/24-12/09/24', '0', 'PV - Prerequisite courses required. See course description.', 'https://www.sjsu.edu/classes/schedules/fall-2024.php', NULL, '', '2024-08-20 13:23:10.434585', '', '2024-08-20 13:23:10.434585', 0, 0);
INSERT INTO "public"."rumi_sjsu_class_schedule_2024_fall" VALUES (415453123437613061, 'Fall 2024', 'AAS 180 (Section 41)', 'https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=180&cur_cat_oid=15&navoid=5382', '41713', 'Fully Online', 'Individual Studies', '', '4.0', 'SUP', 'TBA', 'TBA', 'Staff', '', 'ONLINE', '08/21/24-12/09/24', '3', 'RC - Requires department release of permission number. RD - Requires department approval. RE - Requires negotiated agreements or contracts. Consult department. RO - Not available to Open University students. FULLY ONLINE - NO designated day/time meetings (TBA). May utilize Canvas. More info at sjsu.edu/ecampus', 'https://www.sjsu.edu/classes/schedules/fall-2024.php', NULL, '', '2024-08-20 13:23:10.434585', '', '2024-08-20 13:23:10.434585', 0, 0);
INSERT INTO "public"."rumi_sjsu_class_schedule_2024_fall" VALUES (415453123492139040, 'Fall 2024', 'ATH 12S (Section 01)', 'https://catalog.sjsu.edu/content.php?filter%5B27%5D=ATH&filter%5B29%5D=12S&cur_cat_oid=15&navoid=5382', '40020', 'In Person', 'Skills Development, Football', '', '1.0', 'ACT', 'TBA', 'TBA', 'Staff', '', '', '08/21/24-12/09/24', '0', '', 'https://www.sjsu.edu/classes/schedules/fall-2024.php', NULL, '', '2024-08-20 13:23:10.434585', '', '2024-08-20 13:23:10.434585', 0, 0);
INSERT INTO "public"."rumi_sjsu_class_schedule_2024_fall" VALUES (415453123492139041, 'Fall 2024', 'ATH 12S (Section 02)', 'https://catalog.sjsu.edu/content.php?filter%5B27%5D=ATH&filter%5B29%5D=12S&cur_cat_oid=15&navoid=5382', '40021', 'In Person', 'Skills Development, Football', '', '1.0', 'ACT', 'TBA', 'TBA', 'Staff', '', '', '08/21/24-12/09/24', '0', '', 'https://www.sjsu.edu/classes/schedules/fall-2024.php', NULL, '', '2024-08-20 13:23:10.434585', '', '2024-08-20 13:23:10.434585', 0, 0);
INSERT INTO "public"."rumi_sjsu_class_schedule_2024_fall" VALUES (415453123496333312, 'Fall 2024', 'ATH 12S (Section 03)', 'https://catalog.sjsu.edu/content.php?filter%5B27%5D=ATH&filter%5B29%5D=12S&cur_cat_oid=15&navoid=5382', '40022', 'In Person', 'Skills Development, Football', '', '1.0', 'ACT', 'TBA', 'TBA', 'Staff', '', '', '08/21/24-12/09/24', '0', '', 'https://www.sjsu.edu/classes/schedules/fall-2024.php', NULL, '', '2024-08-20 13:23:10.434585', '', '2024-08-20 13:23:10.434585', 0, 0);
INSERT INTO "public"."rumi_sjsu_class_schedule_2024_fall" VALUES (415453123496333313, 'Fall 2024', 'ATH 12S (Section 04)', 'https://catalog.sjsu.edu/content.php?filter%5B27%5D=ATH&filter%5B29%5D=12S&cur_cat_oid=15&navoid=5382', '40023', 'In Person', 'Skills Development, Football', '', '1.0', 'ACT', 'TBA', 'TBA', 'Staff', '', '', '08/21/24-12/09/24', '15', '', 'https://www.sjsu.edu/classes/schedules/fall-2024.php', NULL, '', '2024-08-20 13:23:10.434585', '', '2024-08-20 13:23:10.434585', 0, 0);
INSERT INTO "public"."rumi_sjsu_class_schedule_2024_fall" VALUES (415453123496333344, 'Fall 2024', 'ATH 44I (Section 01)', 'https://catalog.sjsu.edu/content.php?filter%5B27%5D=ATH&filter%5B29%5D=44I&cur_cat_oid=15&navoid=5382', '40054', 'In Person', 'Women''s Soccer', '', '1.0', 'ACT', 'TBA', 'TBA', 'Staff', '', '', '08/21/24-12/09/24', '22', '', 'https://www.sjsu.edu/classes/schedules/fall-2024.php', NULL, '', '2024-08-20 13:23:10.434585', '', '2024-08-20 13:23:10.434585', 0, 0);

Elasticsearch 索引创建、数据导入和搜索

在此示例中,我们使用 Elasticsearch(ES)来创建索引、导入课程数据并执行搜索操作。为了实现这些功能,我们使用了 Java 编写的 SjsuClassScheduleEsService 服务类。

1. 创建 Elasticsearch 索引

首先,我们需要在 Elasticsearch 中创建一个索引来存储课程数据。索引的名称与数据库表名一致。以下是创建索引的方法: import

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import com.litongjava.db.activerecord.Db;
import com.litongjava.db.activerecord.Page;
import com.litongjava.db.activerecord.Row;
import com.litongjava.db.activerecord.SqlPara;
import com.litongjava.es.client.Elastic;
import com.litongjava.tio.utils.hutool.StrUtil;
import com.litongjava.tio.utils.json.FastJson2Utils;
public void createIndex() {
    CreateIndexRequest request = new CreateIndexRequest(indexName);
    request.settings(Settings.builder().put("index.max_result_window", 10000000));
    request.source("{}", XContentType.JSON);

    RestHighLevelClient client = Elastic.getClient();
    try {
        CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
        log.info("Index created: " + createIndexResponse.index());
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

在创建索引时,我们配置了索引的最大结果窗口 (index.max_result_window) 以支持更大规模的数据查询。

2. 导入数据库记录到 Elasticsearch

接下来,我们从数据库中提取所有课程记录,并将其批量导入到 Elasticsearch 中。为了优化导入性能,我们采用分页查询,每次处理 1000 条记录:

public void importRecords() {
    Long count = Db.countTable(indexName);
    long round = count / 1000 + 1;

    for (int i = 0; i < round; i++) {
        String sql = "select * from " + indexName + " order by id";
        SqlPara sqlPara = SqlPara.by(sql);
        int pageNo = i + 1;
        Page<Row> page = Db.paginate(pageNo, 1000, sqlPara);
        List<Row> list = page.getList();

        BulkRequest bulkRequest = new BulkRequest();
        log.info("start:" + pageNo);
        for (Row r : list) {
            IndexRequest source = new IndexRequest(indexName)
                .id(r.getLong("id").toString())
                .source(FastJson2Utils.toJson(r.toMap()), XContentType.JSON);
            bulkRequest.add(source);
        }
        log.info("finish:" + pageNo);

        BulkResponse bulk = Elastic.bulk(bulkRequest, RequestOptions.DEFAULT);
        log.info("bulk:{}", bulk);
    }
}

3. 在 Elasticsearch 中搜索课程数据

我们可以通过关键词搜索 Elasticsearch 中的课程数据。搜索方法接受分页参数和搜索关键字,构建查询条件并执行搜索:

public List<Map<String, Object>> search(int pageNo, int pageSize, String key) {
    SearchRequest searchRequest = new SearchRequest(indexName);
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().trackTotalHits(true);
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

    if (StrUtil.isNotEmpty(key)) {
        boolQuery.must(QueryBuilders.queryStringQuery(key));
    }
    sourceBuilder.query(boolQuery);
    sourceBuilder.from((pageNo - 1) * pageSize);
    sourceBuilder.size(pageSize);
    searchRequest.source(sourceBuilder);

    SearchResponse search = Elastic.search(searchRequest, RequestOptions.DEFAULT);
    SearchHit[] hits = search.getHits().getHits();
    List<Map<String, Object>> list = new ArrayList<>(hits.length);
    for (SearchHit hit : hits) {
        Map<String, Object> sourceAsMap = hit.getSourceAsMap();
        list.add(sourceAsMap);
    }
    return list;
}

这段代码的主要功能是从 Elasticsearch 中搜索数据,并返回符合条件的结果。为了实现这一点,代码使用了 SearchSourceBuilder 和 BoolQueryBuilder 来构建搜索查询,下面是具体的解释:

BoolQueryBuilder 和 sourceBuilder 的作用

  1. BoolQueryBuilder 的作用:

    • BoolQueryBuilder 是 Elasticsearch 中用于构建布尔查询的工具类。布尔查询允许我们结合多个查询条件(例如 must、should、must_not 等),来实现复杂的查询逻辑。
    • 在这段代码中,boolQuery 被用来构建搜索条件。如果 key 参数非空,代码使用 queryStringQuery(key) 来进行模糊查询,并将其添加到 boolQuery 中的 must 子句中。这意味着如果 key 非空,Elasticsearch 将在所有字段中查找包含该关键字的记录。
  2. SearchSourceBuilder 的作用:

    • SearchSourceBuilder 是 Elasticsearch 中用来构建查询请求的类。它允许我们指定查询的条件、分页信息、排序规则、返回的字段等。
    • 在代码中,sourceBuilder 被用来定义查询的各个部分。首先,它将前面创建的 boolQuery 设置为查询条件,然后通过 from 和 size 方法指定分页信息,即从第几条记录开始 (from) 和返回多少条记录 (size)。
    • sourceBuilder.trackTotalHits(true) 的作用是确保查询返回的结果能够追踪到总的匹配数量,这对于分页查询很重要,因为它可以让我们知道总共有多少条记录符合查询条件。

为什么需要 BoolQueryBuilder 和 sourceBuilder?

  • 灵活性和可扩展性: 使用 BoolQueryBuilder 可以很容易地构建复杂的查询条件。如果以后需要添加更多的查询条件(例如筛选特定字段),可以轻松地将这些条件添加到 BoolQueryBuilder 中。

  • 分页支持: SearchSourceBuilder 提供了分页查询的功能,通过 from 和 size 方法,可以轻松控制查询的起始位置和返回的记录数量。这使得大规模数据查询的性能得到了优化。

  • 易于维护: 将查询逻辑与查询构建分离有助于代码的可维护性。BoolQueryBuilder 负责构建复杂的查询条件,而 SearchSourceBuilder 负责管理整个查询请求的配置。这种分离使得代码更易于理解和扩展。

总结来说,BoolQueryBuilder 用于构建复杂的查询条件,而 SearchSourceBuilder 用于组织这些条件并配置查询请求的其他选项(如分页)。这两个类的结合使得 Elasticsearch 的搜索功能强大且灵活,能够满足各种查询需求。

4.删除索引

  public void deleteIndex() {
    RestHighLevelClient client = Elastic.getClient();
    DeleteIndexRequest request = new DeleteIndexRequest(indexName);
    try {
      AcknowledgedResponse deleteIndexResponse = client.indices().delete(request, RequestOptions.DEFAULT);
      if (deleteIndexResponse.isAcknowledged()) {
        log.info("Index {} deleted successfully.", indexName);
      } else {
        log.warn("Index {} deletion not acknowledged.", indexName);
      }
    } catch (IOException e) {
      log.error("Error deleting index {}: {}", indexName, e.getMessage());
      throw new RuntimeException(e);
    }
  }

具体工作流程

  1. 创建 PostgreSQL 表和插入数据:首先,我们创建了一个数据库表并插入课程数据。此表将作为课程信息的存储库。
  2. 创建 Elasticsearch 索引:通过 Java 服务类中的 createIndex() 方法,我们在 Elasticsearch 中创建了一个索引,来存储课程信息。
  3. 导入数据到 Elasticsearch:从数据库中分页提取课程数据,并通过批量请求将其导入 Elasticsearch 索引中。这一步确保了大规模数据的高效导入。
  4. 搜索功能:通过 search() 方法,用户可以在 Elasticsearch 中查询课程信息,支持模糊搜索和分页查询。

通过以上步骤,我们成功地将课程数据导入 Elasticsearch 并实现了基本的搜索功能。

测试

package com.litongjava.open.chat.services;

import java.util.List;
import java.util.Map;

import org.junit.Test;

import com.litongjava.jfinal.aop.Aop;
import com.litongjava.open.chat.config.DbConfig;
import com.litongjava.open.chat.config.ElasticSearchConfig;
import com.litongjava.tio.utils.environment.EnvUtils;
import com.litongjava.tio.utils.json.JsonUtils;

public class SjsuClassScheduleEsServiceTest {

  @Test
  public void test() {
    EnvUtils.load();
    new DbConfig().config();
    new ElasticSearchConfig().config();
    SjsuClassScheduleEsService sjsuClassScheduleEsService = Aop.get(SjsuClassScheduleEsService.class);
    sjsuClassScheduleEsService.createIndex();
    sjsuClassScheduleEsService.importRecords();
    List<Map<String, Object>> lists = sjsuClassScheduleEsService.search(1, 10, "AAS 1");
    System.out.println(JsonUtils.toJson(lists));
  }

  @Test
  public void searchLawrenceLan() {
    // Lawrence Lan
    EnvUtils.load();
    new DbConfig().config();
    new ElasticSearchConfig().config();
    SjsuClassScheduleEsService sjsuClassScheduleEsService = Aop.get(SjsuClassScheduleEsService.class);
    List<Map<String, Object>> lists = sjsuClassScheduleEsService.search(1, 10, "Lawrence Lan");
    System.out.println(JsonUtils.toJson(lists));
  }
}

返回的结果

[
  {
    "class_number": "47607",
    "tenant_id": 0,
    "notes": "",
    "section": "AAS 1 (Section 01)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "09:00AM-10:15AM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:joanne.rondilla@sjsu.edu",
    "satisfies": "GE: F",
    "term": "Fall 2024",
    "id": "415453123420835840",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=1&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Introduction to Asian American Studies",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Joanne Rondilla",
    "open_seats": "0",
    "days": "MW",
    "location": "DMH358"
  },
  {
    "class_number": "47608",
    "tenant_id": 0,
    "notes": "",
    "section": "AAS 1 (Section 02)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "10:30AM-11:45AM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:joanne.rondilla@sjsu.edu",
    "satisfies": "GE: F",
    "term": "Fall 2024",
    "id": "415453123420835841",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=1&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Introduction to Asian American Studies",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Joanne Rondilla",
    "open_seats": "1",
    "days": "MW",
    "location": "DMH358"
  },
  {
    "class_number": "47609",
    "tenant_id": 0,
    "notes": "",
    "section": "AAS 1 (Section 03)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "03:00PM-04:15PM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:joanne.rondilla@sjsu.edu",
    "satisfies": "GE: F",
    "term": "Fall 2024",
    "id": "415453123425030144",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=1&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Introduction to Asian American Studies",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Joanne Rondilla",
    "open_seats": "0",
    "days": "MW",
    "location": "CL234"
  },
  {
    "class_number": "47610",
    "tenant_id": 0,
    "notes": "",
    "section": "AAS 1 (Section 04)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "12:00PM-01:15PM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:saugher.nojan@sjsu.edu",
    "satisfies": "GE: F",
    "term": "Fall 2024",
    "id": "415453123425030145",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=1&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Introduction to Asian American Studies",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Saugher Nojan",
    "open_seats": "0",
    "days": "TR",
    "location": "HGH122"
  },
  {
    "class_number": "47611",
    "tenant_id": 0,
    "notes": "",
    "section": "AAS 1 (Section 05)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "03:00PM-04:15PM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:wayne.jopanda@sjsu.edu",
    "satisfies": "GE: F",
    "term": "Fall 2024",
    "id": "415453123425030146",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=1&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Introduction to Asian American Studies",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Wayne Jopanda",
    "open_seats": "0",
    "days": "MW",
    "location": "HGH122"
  },
  {
    "class_number": "47612",
    "tenant_id": 0,
    "notes": "",
    "section": "AAS 1 (Section 06)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "09:00AM-10:15AM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:lawrence.lan@sjsu.edu",
    "satisfies": "GE: F",
    "term": "Fall 2024",
    "id": "415453123425030147",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=1&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Introduction to Asian American Studies",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Lawrence Lan",
    "open_seats": "0",
    "days": "TR",
    "location": "HGH122"
  },
  {
    "class_number": "47613",
    "tenant_id": 0,
    "notes": "",
    "section": "AAS 1 (Section 07)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "01:30PM-02:45PM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:lawrence.lan@sjsu.edu",
    "satisfies": "GE: F",
    "term": "Fall 2024",
    "id": "415453123425030148",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=1&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Introduction to Asian American Studies",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Lawrence Lan",
    "open_seats": "0",
    "days": "TR",
    "location": "HGH122"
  },
  {
    "class_number": "48884",
    "tenant_id": 0,
    "notes": "",
    "section": "AAS 1 (Section 08)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "01:30PM-02:45PM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:trung.p.nguyen@sjsu.edu",
    "satisfies": "GE: F",
    "term": "Fall 2024",
    "id": "415453123425030149",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=1&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Introduction to Asian American Studies",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Trung Nguyen",
    "open_seats": "0",
    "days": "TR",
    "location": "CL234"
  },
  {
    "class_number": "48882",
    "tenant_id": 0,
    "notes": "",
    "section": "AAS 1 (Section 09)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "03:00PM-04:15PM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:wayne.jopanda@sjsu.edu",
    "satisfies": "GE: F",
    "term": "Fall 2024",
    "id": "415453123429224448",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=1&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Introduction to Asian American Studies",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Wayne Jopanda",
    "open_seats": "0",
    "days": "TR",
    "location": "DMH358"
  },
  {
    "class_number": "48883",
    "tenant_id": 0,
    "notes": "",
    "section": "AAS 1 (Section 10)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "04:30PM-05:45PM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:wayne.jopanda@sjsu.edu",
    "satisfies": "GE: F",
    "term": "Fall 2024",
    "id": "415453123429224449",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=1&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Introduction to Asian American Studies",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Wayne Jopanda",
    "open_seats": "0",
    "days": "TR",
    "location": "DMH358"
  }
]
[
  {
    "class_number": "47612",
    "tenant_id": 0,
    "notes": "",
    "section": "AAS 1 (Section 06)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "09:00AM-10:15AM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:lawrence.lan@sjsu.edu",
    "satisfies": "GE: F",
    "term": "Fall 2024",
    "id": "415453123425030147",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=1&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Introduction to Asian American Studies",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Lawrence Lan",
    "open_seats": "0",
    "days": "TR",
    "location": "HGH122"
  },
  {
    "class_number": "47613",
    "tenant_id": 0,
    "notes": "",
    "section": "AAS 1 (Section 07)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "01:30PM-02:45PM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:lawrence.lan@sjsu.edu",
    "satisfies": "GE: F",
    "term": "Fall 2024",
    "id": "415453123425030148",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=1&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Introduction to Asian American Studies",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Lawrence Lan",
    "open_seats": "0",
    "days": "TR",
    "location": "HGH122"
  },
  {
    "class_number": "49244",
    "tenant_id": 0,
    "notes": "",
    "section": "AAS 1 (Section 11)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "06:00PM-08:45PM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:lawrence.lan@sjsu.edu",
    "satisfies": "GE: F",
    "term": "Fall 2024",
    "id": "415453123429224450",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=1&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Introduction to Asian American Studies",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Lawrence Lan",
    "open_seats": "0",
    "days": "W",
    "location": "DMH358"
  },
  {
    "class_number": "47647",
    "tenant_id": 0,
    "notes": "",
    "section": "AAS 33A (Section 05)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "03:00PM-04:15PM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:lawrence.lan@sjsu.edu",
    "satisfies": "GE: D",
    "term": "Fall 2024",
    "id": "415453123433418757",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=33A&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Asian Americans in U.S. History I",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Lawrence Lan",
    "open_seats": "0",
    "days": "TR",
    "location": "HGH122"
  },
  {
    "class_number": "47648",
    "tenant_id": 0,
    "notes": "",
    "section": "AAS 33A (Section 06)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "04:30PM-05:45PM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:lawrence.lan@sjsu.edu",
    "satisfies": "GE: D",
    "term": "Fall 2024",
    "id": "415453123433418758",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=AAS&filter%5B29%5D=33A&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Asian Americans in U.S. History I",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Lawrence Lan",
    "open_seats": "0",
    "days": "TR",
    "location": "HGH122"
  },
  {
    "class_number": "42785",
    "tenant_id": 0,
    "notes": "Per CSU, ten seats have been reserved for the Course Match Program. Any unused reserved seats will be released before the semester begins. FULLY ONLINE - NO designated day/time meetings (TBA). May utilize Canvas. More info at sjsu.edu/ecampus",
    "section": "POLS 3 (Section 99)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "TBA",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:lawrence.quill@sjsu.edu",
    "satisfies": "GE: C2",
    "term": "Fall 2024",
    "id": "415453123773157396",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=POLS&filter%5B29%5D=3&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "Fully Online",
    "course_title": "Introduction to Political Thought",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Lawrence Quill",
    "open_seats": "10",
    "days": "TBA",
    "location": "ONLINE"
  },
  {
    "class_number": "43629",
    "tenant_id": 0,
    "notes": "HYBRID - 2 Meeting Patterns: (1) designated In Person with day/time meetings; and (2) NO designated online day/time meetings (TBA). May utilize Canvas. More info at sjsu.edu/ecampus.",
    "section": "POLS 160A (Section 01)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "R 10:30AM-11:45AM TBA TBA",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:lawrence.quill@sjsu.edu",
    "satisfies": "",
    "term": "Fall 2024",
    "id": "415453123773157433",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=POLS&filter%5B29%5D=160A&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "Hybrid",
    "course_title": "Classical Political Thought",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Lawrence Quill",
    "open_seats": "10",
    "days": "R TBA",
    "location": "DMH160"
  },
  {
    "class_number": "41946",
    "tenant_id": 0,
    "notes": "PD - Prereq - Senior standing. P1 - Prereq - 100W. HYBRID - 2 Meeting Patterns: (1) designated In Person with day/time meetings; and (2) NO designated online day/time meetings (TBA). May utilize Canvas. More info at sjsu.edu/ecampus.",
    "section": "POLS 190 (Section 01)",
    "units": "4.0",
    "type": "SEM",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "R 12:00PM-01:15PM TBA TBA",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:lawrence.quill@sjsu.edu",
    "satisfies": "",
    "term": "Fall 2024",
    "id": "415453123773157441",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=POLS&filter%5B29%5D=190&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "Hybrid",
    "course_title": "Senior Seminar",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Lawrence Quill",
    "open_seats": "0",
    "days": "R TBA",
    "location": "DMH149A"
  },
  {
    "class_number": "43472",
    "tenant_id": 0,
    "notes": "PD - Prereq - Senior standing. P1 - Prereq - 100W. RC - Requires department release of permission number. RO - Not available to Open University students.",
    "section": "POLS 190H (Section 01)",
    "units": "1.0",
    "type": "SUP",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "TBA",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:lawrence.quill@sjsu.edu",
    "satisfies": "",
    "term": "Fall 2024",
    "id": "415453123773157443",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=POLS&filter%5B29%5D=190H&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "In Person",
    "course_title": "Honors Thesis",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Lawrence Quill",
    "open_seats": "5",
    "days": "TBA",
    "location": ""
  },
  {
    "class_number": "41466",
    "tenant_id": 0,
    "notes": "PW - Prerequisites, skills or materials are required. Consult the course description or contact department office. FULLY ONLINE - Designated day/time online meetings. May utilize Canvas. More info at sjsu.edu/ecampus",
    "section": "RTVF 161 (Section 80)",
    "units": "3.0",
    "type": "LEC",
    "source_url": "https://www.sjsu.edu/classes/schedules/fall-2024.php",
    "updater": "",
    "times": "03:00PM-05:45PM",
    "update_time": "2024-08-20 13:23:10.434585",
    "instructor_email": "mailto:lschapiro@nineyardsent.com",
    "satisfies": "",
    "term": "Fall 2024",
    "id": "415453123781546106",
    "section_url": "https://catalog.sjsu.edu/content.php?filter%5B27%5D=RTVF&filter%5B29%5D=161&cur_cat_oid=15&navoid=5382",
    "creator": "",
    "create_time": "2024-08-20 13:23:10.434585",
    "mode_of_instruction": "Fully Online",
    "course_title": "Advanced Screenwriting",
    "dates": "08/21/24-12/09/24",
    "deleted": 0,
    "instructor": "Lawrence Schapiro",
    "open_seats": "8",
    "days": "R",
    "location": "ONLINE"
  }
]
Edit this page
Last Updated: 4/20/2025, 8:45:14 AM
Contributors: litongjava
Prev
Elastic-search 注意事项