1 Star 0 Fork 0

brezezee / narutoSearchEngin

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

用C++写的全文搜索引擎

项目背景

现在我们可以在我们可以很容易的在网上搜索到海量的信息,有些网站往往拥有很多优秀的内容,但是缺乏一个灵活而且高效的搜索引擎,导致这个网站的价值没有很好的体现,基于时间轴的或者tag的推荐从另一种角度上来说其实是忽视了用户搜索的主观能动性。

通用的搜索引擎并不能解决这个问题:首先,不能有针对性的垂直搜索,对内容的抓取和索引简单粗暴,无法得到结构化数据,看不到隐藏的内容属性;其次,通用搜索引擎对内容的排序无法进行定制,实时性不够,无法成为网站社区的有机的一部分。

我们如果能够解决这两个问题,那么相信网站内容的价值也会更好的得到体现,同时用户也会越来越适应通过站内搜索引擎更好的获取自己需要资源。

这个项目就是为了实现这样理想的一个尝试。

功能综述

  • 利用redis存储倒排索引和网页库(均在内存),实现高速搜索
  • 利用redis建立缓存,若在缓存直接命中,查询相应速度提高接近100倍
  • 支持中文分词(cppjieba)
  • 支持持久化存储(redis)
  • 采用log4cpp作为日志系统

项目架构

离线索引模块

  • 数据结构:{string : {ID : weight},{ID : weight}...},weight(权重)是通过TD-IDF算法并归一后的权重
  • 存储结构:用redis 的set存储:结构为 key:string set :string(string 需要解析 是ID 和 weight组成的字符串)

查询模块

  • 网页排序:BM25算法 + vsm 之前采用空间向量模型和BM25算法结合(两个算法本来就有共通的地方)增加一些定制性
  • 线程模型:task threadpool 任务队列

缓存模块

  • 内存实现:利用unordered_map 作为缓存数据结构,每个线程维护一个缓存,线程池维护一个缓存,利用timerfd+poll实现缓存动态更新和存盘
  • redis实现:利用redis的string数据结构来存储缓存,缓存内容为封装好的json数组

网络库模块

  • 网络模型:reactor模式,epoll + threadpool的实现i/o线程和计算线程分离

后期优化方向

  • 加入推荐算法
  • 利用Mysql存储网页库文件和索引文件
  • 网络库采用muduo网络库的模型 实现 one loop per thread,实现更高的并发量
  • redis缓存相应参数的调整

空文件

简介

暂无描述 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/brezezee/narutoSearchEngin.git
git@gitee.com:brezezee/narutoSearchEngin.git
brezezee
narutoSearchEngin
narutoSearchEngin
master

搜索帮助