搜索引擎项目总结 | 青训营笔记

242 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第8篇笔记

一、项目介绍

我们小组本次青训营选题为搜索引擎项目, 详情可戳搜索引擎项目Github,构建了一个具备基础功能的搜索引擎,能够让用户通过图形化界面搜索文本信息,实现的具体功能有:

1.1 业务功能

  • 纯文本信息的存储
  • 搜索纯文本信息
  • 用户自定义关键词过滤
  • 搜索结果按条目分页展示
  • “相关搜索”功能,给出可能的关联条目
  • 实现关联度算法,优先向用户展示关联度较高的信息

1.2 项目概述

小组内部使用GitHub协同开发,后端开发基于 Python 的 bottle 框架,一个轻量级的 Python Web 框架, 可以适配各种 Web 服务器;数据库采用 SQLite3;数据集使用 悟空数据集

1.2.1 用户界面/演示视频

  • 主界面

  • 搜索结果界面:其中可以关键词搜索词过滤,搜索结果是按照相关度排序后展示的,左侧展示出相关词语搜索推荐,底部可切换页码。右侧展示出搜索结果,最开始为搜索结果数量和时间,每个搜索结果中“点击此处查看图片”可以查看对应图片

1.2.2 项目架构

暂时无法在飞书文档外展示此内容

项目架构图

暂时无法在飞书文档外展示此内容

服务器端流程图

1.2.3 核心算法

  • 索引计算

对数据集中的数据进行预处理:首先对 title 进行分词,得到关键词,建立正向索引,然后将关键词与 id 和页面文档 url 进行绑定,建立反向索引

暂时无法在飞书文档外展示此内容

  • 相关数据库设计:
    • page_info 表

    • page_index 表

      • idkeywordpage_id
        1example1
  • 关联度计算

关联度表征了用户的搜索文本搜索结果匹配程度,在获取到用户的搜索关键字之后,进行搜索结果的关联度计算,本项目使用余弦相似度作为关联度的计算方法:

Cos(θ) = k=1nx1kx2kk=1nx1k2k=1nx2k2Cos(\theta) = \frac {\sum_{k=1}^n x_{1k}x_{2k}} {\sqrt{\sum_{k=1}^n x_{1k}^2} \sqrt{\sum_{k=1}^n x_{2k}^2}}

  • 相关度计算

相关度用于衡量相关搜索用户输入文本相关程度,在具体实现中,调用了开源语料库 hanlp 的模型。

二、心得体会

通过参加本项目,组内成员经历了从技术学习、需求分析、界面数据库等详细设计到代码实现、软件测试与修改,这一个完整的搜索引擎项目开发生命周期,小组内分工明确,工作有序,氛围良好,认真努力。

大家都能很好的找到工作中的定位,完成自己的任务,当遇到技术问题时,我们都会踊跃思考与讨论去解决问题。在本次项目中,我们不仅收获了满满的技术干货,丰富了个人技能,同时也切实体验到真实的工作环境与氛围,体会到团结与合作的魅力。

最后,非常感谢字节跳动给予这次项目实践的机会,后续我们会继续把项目优化,使用效率更高的数据结构算法、性能更好的Go语言以及具有缓存机制的存储引擎,来完善具有更多功能的、效率更高的搜索引擎。

三、项目总结

亮点

  • 代码可迁移性强
  • 支持用户多关键词搜索
  • 支持关键词高亮

不足

  • 开发周期短,功能有待完善
  • 代码结构优化
  • 算法单一
  • 倒排索引数据库结构没有使用非关系型数据库

改进方向

  • 支持用户登录注册等功能
  • 支持搜索图片 、用户收藏夹
  • 算法方面、存储方面