项目背景
个人项目只能做站内搜索,搜索的数据更垂直,数据量更小
展示的内容应该包括
- 网页的title
- 网页内容的摘要描述
- 即将跳转到的网址url
宏观原理
- 客户端(电脑或手机)
- 浏览器
- 通过http请求的方式进行搜索任务
- 通过GET方式,上传搜索关键字
- 浏览器
- 服务器server
- 服务软件:searcher搜索引擎,绑定特定端口
- 磁盘,有一个目录,会存放在全网当中抓取到的网页信息
- 通过爬虫程序搜索对应的网页并抓下来
- 去标签&&数据清理
- 建立索引,加速网页查找
- 检索索引,得到相关html,根据搜索的结果拼接多个网页的title和desc和url,构建一个新的网页返回给用户
技术栈和项目环境
技术栈:
C/C++,C++11,STL,准标准库Boost(文件操作),Jsoncpp(客户端和服务端数据交换),cppjieba(分词),cpp-httplib(http服务器)
前端:html5,css,js、jQuery、Ajax
项⽬环境:
Centos 7云服务器,vim/gcc(g++)/Makefile(服务端),vs2019 or vs code(网页端)
搜索引擎具体原理
正排索引
正排索引:就是从文档ID找到文档内容(文档内关键字)
定义:文档到内容的映射,存储每个文档及其包含的内容(如单词列表)。
特点:通过文档ID可以直接获取文档的全部内容。
ID | 内容 |
---|---|
1 | apple banana |
2 | banana cherry |
3 | apple cherry |
用途: |
- 直接通过文档ID获取文档内容(如网页快照)。
- 适用于需要完整文档信息的场景。
分词
目标文档进行分词(方便建立倒排索引和查找)
停止词:了,的,吗,a,the,⼀般我们在分词的时候可以不考虑
倒排索引
倒排索引:根据文档内容,分词,整理不重复的各个关键字,对应联系到文档ID的方案
定义:单词到文档的映射,存储每个单词及其出现的文档列表。
特点:通过关键词快速找到包含它的文档。
关键词 | ID |
---|---|
apple | 1,3 |
banana | 1,2 |
cherry | 2,3 |
用途: |
- 搜索引擎的核心结构(如Google搜索关键词时快速定位相关网页)。
- 支持高效的关键词查询和相关性排序。
完整查找过程
用户输⼊:apple -> 倒排索引中查找 -> 提取出⽂档ID(1,3) -> 根据正排索引 -> 找到⽂档的内容 -> title+conent(desc)+ url ⽂档结果进⾏摘要 -> 构建响应结果