目录

2 搜索功能的实现

2.1 背景

1.为什么搜索不用MySQL实现

2.为什么不选solr

3.为什么选Apache Tika

4.为什么选Spring Data Elasticsearch


2 搜索功能的实现

2.1 背景

  1. 项目简介
snapan是一个类似于百度网盘的东西,功能和百度网盘类似,但是比百度网盘多一些东西,比如文件预览,文件内容的搜索。
  1. 数据库简介
用户上传了文件,文件保存在阿里云oss(阿里云的存储平台)里,数据库只保存文件链接,不保存文件内容。(注:OSS 是对象存储服务的简称,能简单、安全地存储和管理图片、视频等各类文件,方便随时访问和分享。阿里云 OSS 是国内较早成熟的对象存储服务,很多企业和开发者的第一选择就是它。)
  1. 搜索功能简介
在snapan中我想实现这么一个搜索功能:
  • 可以实时搜索,用户在输入内容的时候就会显示对应的内容
  • 搜索的时候可以搜索到文件内容
  • 对搜索到的关键字高亮显示
  1. 技术栈
SSM + elasticSearch + Spring Data Elasticsearch + Apache Tika
  1. 原因
1.为什么搜索不用MySQL实现
对于搜索功能,如果没学过elasticSearch或者是Solr,那想到的实现方法就是把库文件内容直接保存到数据库里,然后使用sql的字符匹配去匹配。这里选择elasticSearch而部署MySQL是因为提到的三个核心需求上,它的表现远远不如 Elasticsearch。
具体如下:
  • 实时搜索(用户输入时就显示结果)
  • Elasticsearch: 专为高速查询设计,支持毫秒级响应。它内部使用了倒排索引等优化结构,可以非常快地返回结果,非常适合实现 “边输入边提示” 的实时搜索体验。
  • MySQL: 当数据量变大时,使用 LIKE '%keyword%' 这样的查询会非常慢。因为它需要扫描表中的每一行数据,无法高效地支持实时搜索所需的性能。
  • 搜索文件内容
    • Elasticsearch: 可以方便地存储和索引从文件中提取的文本内容。它能理解文本的结构,并对其进行分词和索引,从而实现高效的全文检索。
    • MySQL: 虽然也能将文本存在 TEXT 或 VARCHAR 字段里,但它的全文搜索功能(FULLTEXT INDEX)在功能和性能上都远不如 Elasticsearch 强大和灵活。对于大量非结构化的文本数据,MySQL 不是最佳选择。
  • 搜索结果高亮显示
    • Elasticsearch: 内置了强大的高亮功能。它在返回匹配结果的同时,可以直接告诉你关键字在哪个字段、哪个位置匹配到了,并可以将关键字用 等标签包裹起来,让你前端直接渲染高亮效果,非常方便。
    • MySQL: 不直接支持高亮显示。你需要自己从查询结果中找到关键字的位置,然后手动进行字符串替换来添加高亮标签,这个过程繁琐且效率低下。
2.为什么不选solr
如果你的需求是 “实时、简单、快速搭建文件内容搜索”,Elasticsearch 生态更贴合;如果需要更复杂的索引定制(比如多语言深度分词、特殊排序规则),Solr 也是可行的,但学习和配置成本会稍高。
3.为什么选Apache Tika
这是为了解决 “如何读取文件内容” 的问题
  • 我的需求是搜索文件内容,而不是简单的文本。用户上传的可能是 PDF、Word、Excel 等各种格式。
  • Tika 的核心作用就是作为一个 “万能文件解析器”。它能自动识别文件类型,并从中提取出纯文本内容,为后续的搜索做好准备。没有 Tika,你就得自己去编写和维护针对不同文件格式的解析逻辑,这会非常繁琐且容易出错。
4.为什么选Spring Data Elasticsearch
最主要的原因就是 为了方便、省事,提高开发效率。
  • 如果不选它:你就必须直接使用 Elasticsearch 本身提供的原生 API(比如 RestHighLevelClient)。这意味着你需要手动构建复杂的 JSON 查询语句,还要处理各种网络请求、数据转换和错误处理。整个过程会非常繁琐,代码也会很臃肿,一不小心就容易出错。
  • 选择了它之后:Spring Data Elasticsearch 相当于给 Elasticsearch 的复杂操作做了一个优雅的 “封装”或者说“翻译”。
  • 你不再需要写复杂的 JSON 查询,而是可以像操作普通数据库一样,使用简单的 Java 方法名来定义查询(例如 findByContentContaining("关键词"))。
  • 它还提供了现成的 Repository 接口,让你可以直接调用 save(), findAll(), delete() 等通用方法,极大地减少了重复代码。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐