怎么用C++写全文搜索引擎

本文介绍了一个使用C++编写的全文搜索引擎项目,旨在解决网站内部搜索引擎的效率和定制化问题。项目利用redis存储倒排索引和网页库,支持中文分词,并采用BM25算法进行网页排序。通过内存缓存和持久化存储提高查询速度,同时采用log4cpp记录日志。未来计划加入推荐算法,优化网络库和调整redis缓存参数。

用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 作为缓存数据结构,每个线程维护一个缓存,线程池维护一个缓
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值