这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记
前言
这次字节跳动后端青训营我们队伍选择的是搜索引擎大作业,因为我们是四个大一组队,之前对搜索引擎只有使用的体验,毫无开发的想法,所以这算是一种对全新领域的了解和尝试了。
数据源
虽然在需求文档里老师提供了华为的诺亚悟空数据库,但那个只有图片url和title,并不能用于文本搜索,所以我们选择了一个开源的python库Scrapy来爬取最近两年人民日报的每一篇报道,保存在MySQL数据库内。
搜索准备
首先我们选择的分词库是jieba(虽然这个库有一些小问题,在我第一篇笔记里提出并解决了)。
我们做的第一件事是把爬来的数据(存于doc_raws表中)的title切词,并以切得的词为索引,把每一篇报道的id存入doc_ids表中,表的结构如下:
| word | ids |
|---|---|
| string | string |
ids字段里保存的是用,分隔的多个含有本词的数据id。
搜索
搜索的流程是先切好搜索词,然后以得到的词为线索在doc_ids表中查询并切片,然后统计每一个id出现的次数,进行排序(这里就是很简易的线性相关度),然后去doc_raws表中取出某一页所需的十条数据,打包传给前端。
相关搜索
因为才疏学浅,没接触过机器学习,所以我们在相关搜索的映射有效处理上选择的是无脑全部接受。
前端会在搜索时判断是否有搜索历史,如果不是第一次搜索就会将前一次与本次搜索词一齐传给后端,后端保存并记权重为1,之后每次搜索一样的两个词就在权重上加1。
最后在搜索某词时返回它权重最大的六个相关搜索词。