# SearchEngine **Repository Path**: fcourage/SearchEngine ## Basic Information - **Project Name**: SearchEngine - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-07-24 - **Last Updated**: 2021-12-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## Search Engine ### 搜索引擎,根据王争在《数据结构与算法之美》中讲解的思路,来用Golang语言实现 ### 搜索引擎大致可以分为四个部分:搜集、分析、索引、查询。 #### 1.搜集,就是我们常说的利用爬虫爬取网页。 ###### 1-1.待爬取网页链接文件:urls.bin ###### 1-2.网页判重文件:bloom_filter.bin ###### 1-3.原始网页存储文件:doc_raw.bin ###### 1-4.网页链接及其编号的对应文件:doc_id.bin #### 2.分析,主要负责网页内容抽取、分词,构建临时索引,计算 PageRank 值这几部分工作。 ###### 2-1. 抽取网页文本信息 ###### 2-2. 分词并创建临时索引 #### 3.索引,主要负责通过分析阶段得到的临时索引,构建倒排索引。 ###### 3-1. 分析阶段产生的临时索引,构建成倒排索引 ###### 3-2. 记录单词编号在索引文件中的偏移位置 #### 4.查询,主要负责响应用户的请求,根据倒排索引获取相关网页,计算网页排名,返回查询结果给用户。 ###### 4-1. 对用户输入的文本进行分词处理,得到 k 个单词 ###### 4-2. 拿这 k 个单词,去 term_id.bin 对应的散列表中,得到了 k 个单词编号 ###### 4-3. 拿这 k 个单词编号,去 term_offset.bin 对应的散列表中,得到了 k 个偏移位置 ###### 4-4. 拿这 k 个偏移位置,去 index.bin 对应的散列表中,得到了 k 个网页编号列表 ###### 4-5. 针对这 k 个网页编号列表,统计每个网页编号出现的次数,得到了一组排好序的网页编号 ###### 4-6. 拿着网页编号,去 doc_id.bin 文件中查找对应的网页链接,分页显示给用户 ###### 假设每个网页大小500KB,100GB 硬盘空间可以存储 210000 个网页 ###### 假设我们的机器的带宽是 10MB,那下载 100GB 的网页,大约需要 10000 秒。也就是说,爬取 100 多万的网页,也就是只需要花费几小时的时间。