网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
热门搜索词
热门搜索词主要来源用户搜索,目前场景比较简单,每天定时任务统计N天前的用户搜词词频,按搜索频次降序排序,存储到MySQL或者redis中。
但这种方法可能存在问题,热搜词没有时间权重衰减, 例如:一个关键词10天前搜索了101次,昨天搜索了100次,10天前的词还能继续排在昨天的热词前面吗? 因此需要设计一个热词衰减权重,搜索时间越长热度权重应该相应的衰减。
联想搜索词
联想搜索需要在用户输入关键词时,联想用户可能想要搜索的词,该功能需要解决2个问题:
- 关联词来源
- 关联词方式
关联词来源可以通过用户搜索关键词记录来提取。
技术选型
技术选择可以根据业务和当前的系统环境来判断:
- 尽量不重复造轮子;
- 使用已有、成熟的、开源的技术栈;
- 能满足需求,成本低、技术可控。
搜索存储引擎目前最成熟活跃的方案非elasticsearch
莫属,我们的系统基于腾讯云TSF微服务
框架搭建,业务数据存在在腾讯云的MySQL
中,因此搜索业务全文检索计划使用腾讯云最新版本的Elasticsearch 8.12
。
es配置选择
在腾讯云es选择配置时,除了考虑文档数据量之外,还需要考虑使用的插件对配置的影响,例如腾讯云自研的QQ分词器
,就比较占资源,这里提示最少要选择2核8G
以上的配置,但我们在8.12版本选的这个配置时,也经常由于堆外内存过大导致了es出现OOM,最后不得不升级到8核16G
,这里大家需要谨慎选择。
文档转换工具选择
我们的需求里面需要将不同类型的文档转换为纯文本,这里有几个开源的实现方案:
工具 | 优点 | 缺点 |
---|---|---|
1. OpenOffice | 1. 一个开源的,功能强大的办公软件套装。2. 支持多种格式的文档转换。3. 支持多语言。4. 可以运行在多种操作系统上。 | 1. 界面比较陈旧。2. 某些高级功能不如付费的办公软件强大。3. 需要较大的系统资源运行。 |
2. Tika | 1. Apache Tika是一个开源的文档类型和元数据提取工具。2. 支持大量的文档格式。3. 可以提取文档中的元数据和文本内容。 | 1. 对于一些复杂的文档格式,提取的结果可能不准确。2. 需要Java环境运行。 |
3. Ingest Attachment | 1. Elasticsearch的一个插件,可以用来提取各种文件的内容。2. 使用Apache Tika进行文档解析。3. 可以直接与Elasticsearch集成,方便进行全文搜索。 | 1. 需要Elasticsearch环境。2. 对于一些复杂的文档格式,提取的结果可能不准确。 |
4. FsCrawler | 1. FsCrawler是一个简单的文件系统爬虫,可以用来索引文件和文件夹。2. 支持OCR和全文搜索。3. 可以直接与Elasticsearch集成。 | 1. 需要Java环境运行。2. 只能处理文件系统中的文件,不能处理网络上的文件。 |
我结合自身业务的情况,选了上面4种之外的方法,我们文档存储在腾讯云COS
,直接调用`腾讯云API转html 或者text文档:文档转 HTML
如果没有使用腾讯云我这边推荐使用`FsCrawler, 可参考我之前的博文。
数据传输选型
我们的数据存储在MySQL
,文档数据存储在对象存储腾讯云COS
中,需要近实时的将文档数据的变更同步到es
数据库中,有以下一些同步方案。
同步方案选型
- 应用同步双写
- 应用异步双写
- 基于MySQL的抽取
- 基于Binlog实时同步
四种方案原理和对比如下:
方案 | 原理 | 优点 | 缺点 |
---|---|---|---|
1. 应用同步双写 | 当应用程序对MySQL进行写操作时,同时对Elasticsearch进行写操作。 | 1. 实时性较高。2. 数据同步过程相对简 |