# 面向文件的搜索引擎 **Repository Path**: zhang-great/file-oriented-search-engine ## Basic Information - **Project Name**: 面向文件的搜索引擎 - **Description**: No description available - **Primary Language**: C++ - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-07-30 - **Last Updated**: 2024-07-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 面向文件的搜索引擎 #### 介绍 {**以下是 Gitee 平台说明,您可以替换此简介** Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} #### 软件架构 搜索引擎项目: 1.离线关键词推荐模块: 生成词典文件和索引文件: 索引的数据结构是键值对 : 字母或者汉字为键 , 所在行号是值。 词典文件是根据语料库 : 把停用词去掉后 的词 作为键 , 值为词出现的次数(词频) 2. 关键词推荐: 1. 先把词典文件和字母索引文件的每个元素都读入到容器分别是vector 和 map里面 。 2. 输入关键词查询时,遍历查询单词的字母形成可能词典的位置的集合,得到所有可能出现该查询词的在词典文件的位置。之后根据位置找到这些候选词, 根据词频和最短编辑距离筛选词。 以最短编辑距离优先相关 , 其次是词频。 3. 关键字推荐使用最短距离算法和词频: 比平常的最短距离多了一个对utf8 编码的处理。在对字符增删改处理的时候针对utf8编码进行处理 , 以适配汉字和英文。 2.离线网页搜索模块:对xml文档用xml处理生成文档库。对文档库使用tf-idf和simhash算法去重。根据文档库生成文档偏移库。根据文档库和文档偏移库生成倒排索引库(字段分别是单词 , 单词所在文章, 单词所在文章的tfidf值 单词所在的另一篇文章 tfidf值)偏移库字段是文档id , 起始位置, 长度。 1. tfidf是评估一个词对于一个文档的重要程度。 2. tfidf : tf:单词词频 ; idf : log2所有文档数/(含有单词的文档数) ; tf* idf. 3. 计算simhash: 1. ()先根据这篇文章所有单词选择选取K个最大tfidf的词 2. 对这些选取的K个词进行hash得到64位的字符hash。 3. 权重: 对已经得到的词的Hash串和词向量的权重计算权重。W= hash * weight . 具体计算:hash串为1的 w=1*weight , hash串为0的,w=weight * -1. 4. 合并: 文本的所有词向量的的位的权重向量相累加,得到一个新的权重向量。得到一个[145,-455, 45] 5. 降维:,以上面提到的 [18 9 -6 -9 22 -35 12 -5] 为例,我们得到 [1 1 0 0 1 0 1 0] 这个bit串,也就是论文中提及的该文本的指纹 相似性判断: 使用海明距离作为相似度判断。 海明距离: 两个二进制串之间相同位置不同的个数。 4. 服务器和客户端的整体架构如下: ![输入图片说明](image.png) 1. 建立线程池。 线程池有一个任务队列。创建每个线程。其任务 是dotask 每个线程等待在任务队列不为空的条件变量上。 ![输入图片说明](image2.png.png) 2. 使用epoll将socket描述符和建立的连接,以及线程间用于通信的eventfd描述符。 通过socket描述符生成连接描述符。 3. 主线程主要负责连接的管理和对连接的IO操作。 子线程是竞争任务队列的任务。执行查询的操作。 4. 每个线程执行的竞争任务队列里面的任务,这个任务是服务器启动时注册到线程池的回调函数。由主线程在客户端的查询信息到来时,使用bind把信息和任务函数绑定之后放入任务队列这样使得队列不空的条件变量就绪。线程竞争到任务后,执行完毕把 信息注册到线程池的发送函数队列。并通过evfd通知主线程可以发送。之后主线程执行发送函数。 ![输入图片说明](image3.png) 5. 执行的任务的逻辑:如果是查询词的推荐那么 先去对应的cache去找对应有没有数据, 如果有那么就可以返回过去。 如果没有那么就在词典库找。 如果是网页的查询那么就在redis缓存找,如果没有就在倒排索引库找。 #### 安装教程 1. 创建build文件夹 2. cd build 3. cmake .. 4. make 5. make install #### 使用说明 1. cd bin ; ./buildDict ; ./pageLibCreate ; ./searchSever 2. cd client ; ./client #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)