最近有同学在群里问:高校科研系统到底用什么技术栈最稳?我给的答案是:Spring Boot + Elasticsearch 的组合。这不是拍脑袋,而是我做过好几套高校科研信息管理系统之后总结出来的经验。Spring Boot负责把业务逻辑、权限、事务这些"后台活儿"收拾得干干净净,Elasticsearch负责把论文、课题、成果这些最难查的数据快速翻出来。
这套项目最大的价值在于:它把高校科研管理中那些看似零散的需求——教师科研履历、项目申报与结题、论文收录登记、成果查重检索、学院科研统计——全部统一到一个系统里,并且用Elasticsearch解决了传统关系型数据库在大文本检索场景下"查得慢、查不准"的痛点。无论你是Java学习者、正在做毕业设计的学生,还是刚接手高校信息化项目的开发人员,这篇内容都能让你少走一段弯路。我下面会从架构选型、索引建模、代码实现到问题排查,完整拆解一遍。
1. 项目整体设计与技术选型
1.1 高校科研管理系统到底要解决什么问题
高校科研管理不是一个简单的“登记台账”需求。拿我实际接触过的高校场景举例,科研处每天要面对的东西包括:教师发表的SCI/EI论文、纵向和横向课题、专利申请、学术获奖、学术会议报告、科研经费到账情况,还有年终考核时各学院的科研成果统计。这些数据的特点是:条目数量大、字段差异明显、描述文本长、查询条件组合复杂。
比如老师想查“近三年计算机学院教师发表的、被SCI收录的、标题里包含‘知识图谱’的论文”,如果用MySQL硬查,SQL要么写得极长,要么需要join五六个表,而且LIKE '%知识图谱%'这种模糊查询在数据量上来之后会直接拖垮数据库。这还不算最麻烦的,更麻烦的是同一篇论文可能同时关联多个作者、多个项目,关联关系一多,关系型数据库的查询速度就肉眼可见地往下掉。
所以高校科研信息管理系统的核心矛盾不是“存不下”,而是“查不好”。基于这个判断,系统在架构上就不能再走“一张大表打天下”的老路,而应该引入专门的检索引擎。Elasticsearch在这里扮演的就是全文检索引擎和聚合分析引擎的双重角色,它的倒排索引机制让“在大批量文本里找关键词”成了强项,聚合功能又让“按学院统计论文数量”这类需求变得非常简单。
1.2 为什么技术栈选择了Spring Boot + Elasticsearch
先聊后端框架。高校信息类项目通常不是单机玩具,它要对接统一身份认证,要接人事系统的教师数据,偶尔还要给教务系统提供接口。Java生态里能扛住这类需求的框架,Spring Boot是绕不开的选择。它的自动装配机制省掉了一大堆XML配置,内嵌Tomcat让部署也简单,打一个jar包就能在服务器上跑起来。加上Spring家族对事务、缓存、安全框架的支持非常成熟,开发这一类管理系统用Spring Boot综合成本最低。
Elasticsearch这部分,我需要先破除一个误区:它不是用来替代MySQL的。在这个项目里MySQL依然是业务数据的主库,负责存储教师基本信息、项目审批状态、用户账号这类强事务性数据。Elasticsearch则单独维护一套索引数据,专门服务搜索、筛选、统计页面。底层数据通过异步方式同步,让两边各司其职。
这种“业务库+搜索库”双轨结构在互联网行业早就被验证过了。高校科研查询场景里,用户不在乎毫秒级强一致,只是希望搜索响应快、关键词命中准,ES的准实时性完全够用。而且ES自带的聚合分析能力可以直接支撑科研统计报表,减少后端用Java写一堆循环统计的笨办法。
从开发调试的角度讲,Elasticsearch有Kibana作为可视化工具,索引数据长什么样、查询语句返回什么结果都一目了然。这在项目调试阶段的体验很好,甚至能让非技术背景的科研处老师看懂“我们到底给论文数据建了什么字段”。
1.3 系统模块划分与数据流向
实战中我习惯把系统拆成五块:基础数据模块、科研业务模块、检索统计模块、系统管理模块和同步模块。
基础数据模块负责人事相关的基础信息,包含教职工姓名、学院、职称、研究方向等。科研业务模块是核心录入入口,处理论文、项目、专利、获奖等内容的申报与审核。检索统计模块面向最终用户,提供跨模块的关键词搜索,比如输入教师姓名能直接看到她名下的论文列表、在研项目和专利情况。系统管理模块做菜单权限和用户角色管理。同步模块则负责在MySQL数据发生变化时,把增量数据推送到Elasticsearch。
数据流向上有一个需要重点设计的地方:业务操作先写MySQL,提交成功后立即发送一条同步消息,再通过独立的同步逻辑更新ES索引。这样的好处是主业务流程不会被搜索引擎的故障拖死,哪怕ES临时挂掉了,论文照样能登记入库,等ES恢复后再做一次补偿同步就行。如果采用“先写ES再写MySQL”或者“在业务事务里直接调用ES接口”的方案,一旦ES响应超时,整个论文申报流程都会被卡住,这在真实场景里是不可接受的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 索引模型设计:从MySQL表到ES文档
2.1 核心实体关系梳理
在做索引设计之前,得先把高校科研领域里的核心实体搞清楚。我经手的项目里一般会抽象出这样几类:
- 科研人员:教师和研究人员,核心字段是工号、姓名、学院、职称、学历、研究方向。
- 科研项目:项目名称、项目来源、项目级别、负责人、经费金额、立项时间、结项时间、参与人员。
- 论文成果:论文题目、摘要、关键词、期刊名称、发表时间、收录情况、作者列表、所属项目。
- 专利成果:专利名称、专利类型、发明人、申请日、授权日、法律状态。
- 获奖成果:奖项名称、获奖级别、获奖人、获奖年份。
实体之间不是孤立的。一篇论文可能有多个作者,一个作者可能挂靠多个项目,项目负责人本身也是科研人员。传统设计势必要建中间关联表,查询的时候层层join。但到了ES里就不用这么僵硬,我倾向于把索引设计成“大宽表”,以检索主题为中心把相关字段冗余进来。
例如建一个research_paper索引,文档内部给authors字段设计成嵌套对象,每个作者对象里包含姓名、工号、是否通讯作者、所属学院。查询的时候无论按作者名找论文,还是按论文找作者信息,一次检索就能拿到全部数据,不用再回到MySQL查关联关系。这在写检索接口时会省非常多事。
2.2 全量同步与增量同步的取舍
MySQL数据进ES,方式无外乎全量同步和增量同步两种。对于这个项目,上线初始化阶段用全量同步,正常运营期间用增量同步。
全量同步的实现在项目初期最简单:写一个定时任务,每天凌晨把当天更新的数据批量拉到ES里。缺点是数据不够新鲜,白天新登记的一篇论文要到第二天凌晨才能被搜到。如果系统允许论文登记后立刻就要在搜索结果里出现,那全量定时同步就不够用了。
所以我在项目里做了双保险:核心业务表发生变化时,业务Service在事务提交后发送一条RabbitMQ消息,消息里带着操作类型和数据主键;一个独立的同步消费者收到消息后,从MySQL查出完整数据再写入ES索引。同时保留一个每半小时跑一次的补偿定时任务,扫描最近30分钟内有更新的数据,把漏掉的消息补上。这种机制在毕业设计和商用项目里都够用,也不会引入太复杂的中间件维护成本。
你可能会问,为什么不直接用Canal监听MySQL的binlog做同步?Canal确实是很成熟的方案,但在单体Spring Boot项目里引入Canal意味着还要维护一个Canal Server进程,对部署和排障要求更高。如果只是给高校做一个科研管理系统,用消息队列加定时补偿已经能覆盖绝大多数场景,团队维护起来也轻松得多。
2.3 索引Mapping设计的几个关键点
Mapping是ES索引的灵魂,设计不好后面查询性能会很难受。我在这个项目里重点把握四个原则。
第一,需要精确匹配和排序的字段必须设置keyword类型。典型的是学院名称、项目级别、论文收录情况。比如学院名“计算机学院”如果被分词器切碎了,按学院做筛选时就会出问题,把它设置成keyword后可以进行完整的term匹配,还能做聚合统计。
第二,长文本检索字段使用合适的分词器。论文标题和摘要肯定是需要全文检索的,默认的standard分词器会把中文按字切分,搜“图谱”可能匹配不到“知识图谱”。国内场景更常用的做法是装IK分词器,用ik_max_word做索引分词,让“知识图谱”能切出“知识”、“图谱”、“知识图谱”等词项;查询时用ik_smart做粗粒度切分,提高召回准确率。
第三,多字段类型要善用fields。比如项目名称字段我希望它既能被模糊搜索,又能被精确排序,那就声明成text类型并带上一个keyword子字段:
json复制{
"projectName": {
"type": "text",
"analyzer": "ik_max_word",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
第四,嵌套对象要小心扁平化问题。ES的object类型在底层会把内部字段扁平化成authors.name、authors.id这种形式,如果两个作者的姓名和id交叉错位,查询结果就会出错。像作者这种有独立业务含义的对象,应该用nested类型而不是object类型,代价是查询时要多写一层nested查询,但数据的正确性是最重要的。
3. Spring Boot整合Elasticsearch的核心实现
3.1 项目依赖与基础配置
Spring Boot整合ES,依赖选型上有讲究。老的spring-boot-starter-data-elasticsearch版本基于TransportClient,但是从ES 8开始TransportClient被移除了,官方主推的是Java API Client。如果你用的Spring Boot版本比较高,还想用旧版的RestHighLevelClient,要么手动降版本,要么就得处理一堆过时API的报错。
我在项目里的做法是:Spring Boot使用2.7.x,ES服务端使用7.17.x,客户端用RestHighLevelClient。理由很简单,这套组合经过大量生产项目验证,网上遇到的坑基本都有现成答案。如果你的环境里ES是8.x甚至9.x,建议直接使用官方的Elasticsearch Java Client,代码写法会稍有不同,但思路一致。
依赖就加一个:
xml复制<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.17.10</version>
</dependency>
然后在配置文件里把ES地址和连接参数管理起来:
yaml复制elasticsearch:
hosts: 127.0.0.1:9200
connect-timeout: 5000
socket-timeout: 60000
connection-request-timeout: 5000
max-connect-num: 20
max-connect-per-route: 10
配置类里创建一个RestHighLevelClient Bean,确保整个应用复用同一个客户端实例,而不是每次请求都新建一个连接。连接复用是ES客户端性能的重要影响因素,建连不是免费操作,频繁创建客户端会浪费大量socket资源,严重时直接触发端口耗尽。
3.2 复杂检索业务的后端实现
系统里最有代表性的一个查询是论文综合检索,用户端页面会有搜索框、下拉筛选、时间范围这几种控件。对应的ES查询结构就包含三层逻辑:
入口是BoolQueryBuilder,内部必然是多个查询条件的组合。关键词搜索用must子句,学院筛选用filter子句,时间范围也用filter。原因是filter只做条件过滤不参与相关度打分,ES会给filter的结果缓存起来,性能比must好不少。只有关键词这种真正影响“哪个结果排前面”的条件才放进must。
用一个代码片段展示核心逻辑:
java复制SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 关键词用于全文检索
if (StringUtils.isNotBlank(keyword)) {
boolQuery.must(QueryBuilders.multiMatchQuery(keyword,
"title", "summary", "keywords")
.analyzer("ik_smart"));
}
// 学院精确筛选,不参与打分
if (StringUtils.isNotBlank(college)) {
boolQuery.filter(QueryBuilders.termQuery("authors.college", college));
}
// 发表时间范围
if (publishStartDate != null || publishEndDate != null) {
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("publishDate");
if (publishStartDate != null) {
rangeQuery.gte(publishStartDate);
}
if (publishEndDate != null) {
rangeQuery.lte(publishEndDate);
}
boolQuery.filter(rangeQuery);
}
sourceBuilder.query(boolQuery);
sourceBuilder.from((pageNum - 1) * pageSize);
sourceBuilder.size(pageSize);
这里能看出ES查询和SQL思维的一个差异:组合条件不是靠字符串拼接,而是靠builder层层嵌套。刚开始写ES的人容易把所有条件一股脑塞进must,性能没差多少,但语义不清晰,后面看代码的人很难维护。
查询结果返回后还有一个细节:默认只返回_source里的全部字段。如果论文索引里塞入了大段的摘要文本,列表页根本不需要这些内容,应该用fetchSource来指定返回字段,减小网络传输和内存压力。等到用户点开详情时再根据ID从MySQL查完整数据也行,从ES查询详情也行,看你自己的索引设计。
3.3 关键词高亮与聚合统计
论文检索页上,关键词高亮几乎属于标配。ES实现高亮就是靠一个highlight参数,告诉它命中位置需要包上标签,前端再把标签替换成红色字体。前端拿到高亮结果,直接渲染<em class="highlight">片段就能让用户快速定位到命中的位置。
java复制HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("title");
highlightBuilder.field("summary");
highlightBuilder.preTags("<span style='color:red'>");
highlightBuilder.postTags("</span>");
sourceBuilder.highlighter(highlightBuilder);
在解析结果时需要注意:如果命中的是title字段,返回的highlight结果里字段名就是title;如果命中的是带嵌套类型的作者名,高亮片段里会有路径前缀。不熟悉ES映射的开发者容易在这里踩坑,直接用result.getSourceAsMap().get("title")取出的是完整体原文而不是高亮片段,必须要从getHighlightFields()里取。
聚合统计这块我讲讲ES怎么支撑科研年报。高校每年年终都要统计各学院发表论文数、各项目级别的课题数,这些报表需求不需要发到后端用Java慢慢算,一条ES聚合请求就能搞定。
java复制TermsAggregationBuilder aggBuilder = AggregationBuilders.terms("by_college")
.field("authors.college.keyword")
.subAggregation(AggregationBuilders.terms("by_level")
.field("paperLevel.keyword"));
聚合结果是多层的桶结构,后端解析一次就能拼出“X学院,Y级别的论文Z篇”这种二维交叉统计。相比MySQL里写GROUP BY再手动做行列转换,ES的聚合灵活度要高很多,换一个统计维度只需要调整聚合字段,不用动SQL结构。
3.4 多条件检索的性能优化策略
很多人做完检索功能后发现响应时间不够快,第一步就怀疑ES不行。实际上更多时候是查询写得不聪明。我用这个项目验证过几条优化策略,非常值得拿出来讲。
深分页问题是最常见的坑。默认ES分页用from + size,但这个机制在页码深了以后非常消耗内存,因为每个分片都得把前面的数据全部取出并排序,最后在协调节点汇总。当年底科研统计需要导出第100页数据时,这个消耗就尤为明显。正确做法是不要无限翻页,管理系统里常规页面最多翻到几十页就够用,导出功能则改用scroll或search_after。
search_after的实现思路是记住上一页最后一条记录的排序值,下一页从这个值开始取。它的分页状态不保存在服务端,而是由请求参数携带,天然适合并发场景。需要注意的是使用search_after时查询语句里必须有统一的排序字段,而且不能直接跳页。
索引字段设计对性能的影响也不可忽视。keyword类型的字段会被doc_values存储,text字段则不一定,如果某个字段只用来搜索不需要排序聚合,可以关闭doc_values节省磁盘。反过来,如果某个keyword字段经常被聚合,建议开启eager_global_ordinals,把全局序号加载提前到refresh阶段,聚合响应会明显更快。
最后是连接池和线程池的配合。RestHighLevelClient内部依赖一个线程池处理请求回调,默认线程数不算大。如果系统并发量高,可以调大elasticsearch.rest-client的连接池参数,同时控制业务侧访问ES的线程数量,避免请求堆积造成Tomcat线程全部阻塞。
4. 环境搭建与调试工具链
4.1 Windows本地启动Elasticsearch的注意事项
考虑到不少开发者是在Windows环境下做开发调试,我单独说说Windows启动ES会遇到的事儿。
从ES官网下载对应版本的zip包后,直接解压,进入bin目录双击elasticsearch.bat是能启动的。但有几个点很多人第一次没注意。ES默认不允许用root和Administrator账户运行,Windows下如果账户权限过高,启动时报错概率会增大。这时需要在config/elasticsearch.yml里检查path.data和path.logs目录配置,确保当前用户对这些目录有读写权限。
JDK版本也是个高频问题。ES 7.17内置了JDK,启动时如果不希望它使用系统里的JDK,可以设置环境变量JAVA_HOME指向ES自带的jdk目录。反过来,如果Spring Boot项目需要JDK 8运行,而ES版本要求JDK 11以上,两者其实不冲突,因为ES 7.17会自动用内置JDK启动,只要系统环境变量没有强制干扰,业务项目和ES服务互不影响。
Windows启动ES非常容易踩的一个报错是bootstrap check failure,这通常发生在生产配置模式下,因为默认的elasticsearch.yml配置了network.host: 0.0.0.0。开发调试时建议把这行注释掉,让ES只绑定localhost,既避免安全检查问题也减少端口暴露。本地IP绑定成0.0.0.0后,ES会强制要求启用安全认证或者关闭安全检查,不熟悉配置的人很容易卡在这一步。
4.2 Kibana在开发调式中的用法
Kibana部署不只是给运维看监控用的,在开发阶段它更是调试ES查询的神器。项目里我习惯把所有涉及ES的接口先放到Kibana的Dev Tools里跑通,再回写到Java代码里。
Dev Tools里写查询语句有一个非常实用的体验:左边写JSON格式的DSL,右边立刻出返回结果,语法提示也齐全。很多后端开发者写完Java代码后找不到问题在哪,其实最有效的排查方法就是把代码里构建的JSON语句复制到Kibana里执行一次,看看到底是查询语句本身有问题,还是Java解析流程出了问题。
查看索引列表也是Kibana的高频操作。用GET /_cat/indices?v可以查看所有索引的文档数、存储大小和健康状态。排查数据同步是否成功时,先看索引里有没有文档,再看文档内容是否完整,基本能定位到问题是在写入端还是在查询端。另外GET /research_paper/_mapping可以直接查看当前索引的字段映射,方便核对字段类型是否和预期一致。
4.3 分词器的安装与验证
中文分词这块,我在前面提了IK分词器,这里讲讲实际安装验证过程。ES本身没有管理插件的图形入口,需要用命令行安装:
bash复制bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.10/elasticsearch-analysis-ik-7.17.10.zip
插件版本必须和ES版本严格对应,版本没对上会直接启动失败。安装后重启ES,然后打开Kibana Dev Tools测试:
code复制POST /_analyze
{
"text": "基于知识图谱的高校科研管理系统",
"analyzer": "ik_max_word"
}
返回结果里能看到“知识图谱”被切分成几个词项。要注意的是,ik自带的主词典覆盖不了所有领域词汇,比如一些生僻的科研术语会切得不好。这时候可以在IK插件目录的config下新建自定义词典文件,把专业术语加进去,然后通过IKAnalyzer.cfg.xml配置扩展词典。配置完成后同样需要重启ES才能生效。
5. 常见问题与排查技巧实录
5.1 典型报错与解决对照
这个项目从开发到上线,我踩过的、以及帮别人排查过的问题里,有几类是必知必会的。整理成一张速查表方便大家对照:
| 现象 | 根本原因 | 解决办法 |
|---|---|---|
| ES启动报insufficient memory | 默认堆内存设置过大,电脑内存不够 | 修改jvm.options里的-Xms和-Xmx为1g~2g |
| Spring Boot连接ES报connection refused | ES服务没有启动或者端口不对 | 检查9200端口,确认ES进程和客户端host配置一致 |
| 查询结果只有10条 | ES默认分页size就是10 | 显式设置sourceBuilder.size() |
| 搜索中文只按字匹配 | 没装中文分词器或mapping用了standard | 安装IK分词器,重建索引 |
| 升级ES版本后客户端报错 | RestHighLevelClient与ES版本不兼容 | 统一客户端和ES版本,或换用Java API Client |
| 索引里能查到数据但Kibana看不到 | 新建索引需要刷新索引模式 | 在Kibana Stack Management里重新匹配索引模式 |
| 数据同步出现重复文档 | 消费端未做幂等 | 用数据主键做docId,写入时使用id字段去重 |
| 搜索关键词包含特殊字符报错 | 查询语句里未做转义 | 对用户输入里的特殊字符进行转义处理 |
5.2 高版本Spring Boot与ES的兼容问题
最近在技术社区里看到很多人问“Spring Boot版本太高怎么办”,这基本指的都是Spring Boot 3.x和ES客户端整合时遇到的问题。Spring Boot 3把javax包全部迁移到了jakarta,很多旧版ES客户端代码直接编译不过。
如果你的毕设或项目非要采用Spring Boot 3,建议直接使用新版Elasticsearch Java Client,代码风格上最大的变化是构建DSL的方式从builder模式换成了更函数式的写法。新版客户端不依赖jakarta还是javax这个问题,因为它的核心库底层连接用的是Java标准库的HTTP客户端,绕开了一大堆兼容性坑。
但如果你只是做一个管理系统,没有使用Spring Boot 3的硬性需求,我个人建议还是选Spring Boot 2.7 + ES 7.17的稳妥组合。这个组合下的资料最全,遇到问题搜索时几乎都能找到对应答案,把精力省下来去处理业务逻辑会更值。
5.3 从10秒到300毫秒的一次查询优化实录
项目里导数据阶段出现过一次很典型的查询性能问题。当时论文索引里只有5万条数据,按论文标题做模糊查询,页面响应时间居然接近10秒。排查后发现,查询时Java代码里拼了一个wildcard查询,*关键词*这种写法会把所有文档从头到尾扫描一遍,索引完全派不上用场。
这种用法的本质是拿ES当成了MySQL的LIKE来用,完全没有利用倒排索引的结构。解决方案是把该字段的mapping改成带IK分词器的text类型,然后用match_phrase查询替代wildcard查询,让ES在倒排索引里快速定位词项。改造后同样的5万条数据,查询时间降到了300毫秒以内,性能提升非常明显。
这个案例说明了一个道理:ES查询优化首先要看查询方式是否符合索引原理。一个wildcard或者script查询能轻松毁掉ES的全部性能优势,而一个合理的全文查询则能让ES展现它应有的实力。
5.4 同步链路数据不一致的处理心得
使用消息队列做增量同步后,系统从机制上就天然存在“数据不一致的窗口期”。我在项目里发现,偶尔会有论文状态已经改成“已审核”,但ES里还是“草稿状态”的情况。问题原因大多是同步消费消息时抛了异常,消息被重试几次后进了死信队列,没有后续处理逻辑。
我给团队定了一个简单有效的处理流程:所有同步消息消费成功之后,额外在Redis里记录一条"最新同步位置"标记,定时任务定期从MySQL查最近15分钟更新的数据,把ES和MySQL两边对比一遍,发现状态不一致就重新推送。这样即使消息丢失也能被补偿任务找回来。
当然,对比任务不可能每秒钟都跑,所以系统要接受秒级或分钟级的数据延迟。对于科研管理系统来说,论文在这个小时内被搜到和下一分钟被搜到,对用户体验几乎没有区别,没必要为了强一致引入复杂的分布式事务框架。在技术方案里懂得取舍,往往比堆技术更有工程价值。
6. 实操中额外想分享的几点心得
写代码之前一定要先设计好索引mapping,中途改mapping意味着要重建索引,重建期间查询服务会中断,或者至少会出现短时间的数据不一致。我吃过一次亏,论文索引上线后才发现作者字段的nested类型设错了,结果导了全量数据又要删除重建,光同步就跑了半个多小时。如果一开始就把实体关系和字段类型梳理清楚,这半小时完全能省下来。
调试ES查询时不要只盯着Java代码,先用Kibana确认DSL语句没问题再去看代码。很多看似匪夷所思的bug,比如“搜索没有结果”“高亮没生效”“聚合结果不对”,基本都能在Kibana里一眼看出端倪。学会用Kibana调试,等于给自己装了一个ES的透视镜。
给高校做系统还有一个容易被技术人忽略的点:科研处的老师并不关心你用了什么搜索引擎,他们只关心“查东西快不快、导出的Excel能不能用、统计报表对不对得上”。所以项目里除了把ES功能做好,也要多花心思在Excel导入导出和列表页字段展示上。技术方案能服务于真实的业务场景,才算真正落地。
这套系统后续想扩展也不难。比如接入统一身份认证做单点登录、用Logstash把数据同步改成更自动化的管道、给用户增加检索历史推荐功能,都是在现有架构上做加法的事。ES的潜力很大,希望你在做完这个项目后,不只是会调接口,还能理解搜索引擎在业务系统里该站什么位置。
