诗词文化作为中华文明的重要载体,其数字化管理一直面临数据量大、检索效率低、分析维度单一等痛点。这个基于SpringBoot和大数据技术的诗词信息系统,正是为了解决这些实际问题而设计的全栈解决方案。我在实际开发中发现,传统诗词数据库往往只实现基础CRUD功能,而本项目通过整合Elasticsearch全文检索、Hadoop离线分析、Spark实时计算等技术栈,能够实现千万级诗词数据的毫秒级检索和多维度的可视化分析。
从技术选型角度看,SpringBoot提供了快速构建微服务的能力,而大数据组件的引入则让系统具备了处理非结构化文本数据的工业级能力。这种组合既保证了开发效率,又满足了高校对毕业设计项目"技术深度+完整度"的双重要求。特别值得一提的是,系统支持从原始文本解析、数据清洗到智能推荐的完整pipeline,这在大数据类毕设中并不多见。
后端采用SpringBoot 2.7 + MyBatis-Plus组合,前者提供自动配置和嵌入式Tomcat支持,后者简化了传统DAO层开发。数据库选择MySQL 8.0作为主存储,同时使用Redis缓存热点数据。这种基础架构能支撑日均10万级的访问量,符合大多数高校答辩环境的演示需求。
大数据组件方面:
注意:组件版本选择需保持兼容性,例如Spark 3.0需配套Scala 2.12,这些依赖关系需要在pom.xml中精确配置
系统采用领域驱动设计(DDD)划分模块:
code复制poetry-system
├── poetry-admin // 管理后台(Spring Security)
├── poetry-common // 公共组件
├── poetry-gateway // API网关
├── poetry-mapper // 数据访问层
├── poetry-service // 业务逻辑层
└── poetry-web // 前端接口
大数据处理部分独立为:
code复制poetry-bigdata
├── data-collector // 网络爬虫
├── data-processor // Spark流处理
└── data-visualization // 分析报表
采用WebMagic爬虫框架构建分布式采集系统,关键配置如下:
java复制// 示例:唐诗三百首采集规则
public class TangshiPageProcessor implements PageProcessor {
@Override
public void process(Page page) {
page.putField("title", page.getHtml().xpath("//h1/text()"));
page.putField("author", page.getHtml().xpath("//div[@class='author']/text()"));
page.putField("content", page.getHtml().smartContent());
}
}
数据清洗阶段需要处理:
创建索引时需特别优化中文分词:
json复制PUT /poetry_index
{
"settings": {
"analysis": {
"analyzer": {
"ik_smart_pinyin": {
"type": "custom",
"tokenizer": "ik_smart",
"filter": ["pinyin_filter"]
}
}
}
},
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "ik_smart_pinyin"
}
}
}
}
复合查询DSL示例:
java复制BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("content", keyword))
.filter(QueryBuilders.rangeQuery("create_time").gte(startDate));
使用Structured Streaming处理用户行为日志:
scala复制val wordCounts = spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "localhost:9092")
.load()
.selectExpr("CAST(value AS STRING)")
.groupBy("value")
.count()
性能调优参数:
properties复制spark.executor.memory=4G
spark.driver.memory=2G
spark.sql.shuffle.partitions=200
问题现象:部分古诗词中的生僻字(如"㵘")存入MySQL后变成问号
解决方案:
sql复制ALTER DATABASE poetry CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
code复制jdbc:mysql://localhost:3306/poetry?useUnicode=true&characterEncoding=utf8mb4
问题描述:中文分词导致高亮片段偏移量计算错误
修复方案:
java复制HighlightBuilder highlightBuilder = new HighlightBuilder()
.field("content")
.preTags("<em>")
.postTags("</em>")
.fragmentSize(50)
.numOfFragments(3)
.boundaryScannerType(BoundaryScannerType.SENTENCE);
当某些诗人作品量极大时(如杜甫1400首),会导致任务卡在最后几个stage
优化方法:
scala复制// 添加随机前缀打散热点
val skewedRDD = rdd.map {
case (key, value) =>
if(key == "杜甫") (s"${Random.nextInt(10)}_$key", value)
else (key, value)
}
// 聚合后去除前缀
val result = skewedRDD.reduceByKey(_ + _)
.map {
case (key, value) =>
if(key.contains("_")) (key.split("_")(1), value)
else (key, value)
}
使用Docker Compose编排服务:
yaml复制version: '3'
services:
elasticsearch:
image: elasticsearch:7.16.2
environment:
- discovery.type=single-node
ports:
- "9200:9200"
spark:
image: bitnami/spark:3.2.0
depends_on:
- elasticsearch
在application.yml中配置Tomcat线程池:
yaml复制server:
tomcat:
max-threads: 200
min-spare-threads: 20
添加JVM启动参数:
code复制-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=45
基于GPT-2微调模型:
python复制def generate_couplet(input_text):
model = GPT2LMHeadModel.from_pretrained("gpt2-poetry")
tokenizer = GPT2Tokenizer.from_pretrained("gpt2-poetry")
inputs = tokenizer.encode(input_text, return_tensors="pt")
outputs = model.generate(inputs, max_length=50)
return tokenizer.decode(outputs[0])
使用StyleGAN2进行书法风格转换:
java复制@PostMapping("/style-transfer")
public ResponseEntity<byte[]> transferStyle(@RequestBody StyleRequest request) {
BufferedImage result = styleService.transfer(request);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(result, "png", baos);
return ResponseEntity.ok().body(baos.toByteArray());
}
在实际开发中,我发现大数据组件的资源监控尤为重要,建议在管理后台集成Prometheus+Grafana监控看板,实时显示ES查询延迟、Spark作业状态等关键指标。对于需要演示的毕业设计,可以预先准备几组典型查询的执行计划对比,直观展示优化前后的性能差异