有一组微博事件数据,之前做了一些数据分析与挖掘的工作。想着用C++做一个简单的搜索引擎玩玩。
亮点:
详细代码请到github:https://github.com/li-car-fei/SEWeibo
求求点个star~~
预处理阶段:
实际搜索阶段:
AND
,OR
,NOT
Log 日志:
2023-11-10 17:06:15,951: INFO rootCategory : Log init success
2023-11-10 17:06:17,226: INFO rootCategory : cppjieba init!
2023-11-10 17:06:21,692: INFO rootCategory : 停词库,情感词表,网页库,偏移库,倒排索引库,情感得分表 读取数据成功!
2023-11-10 17:06:28,979: INFO rootCategory : >>client has connected 127.0.0.1:9006 >> 127.0.0.1:34133
2023-11-10 17:06:28,979: INFO rootCategory : search event: 蔡徐坤
2023-11-10 17:06:28,980: INFO rootCategory : redis key exists: 蔡徐坤
2023-11-10 17:06:28,980: INFO rootCategory : >>client has broken up 127.0.0.1:9006 >> 127.0.0.1:34133
...
frontend文件夹
json
数据,前端用jquery
进行解析渲染using Task = function;
定义了添加到线程池任务队列的数据类型,是一个可调用对象(函数、函数指针、lambda表达式等皆可)log4cpp
实现日志,单例模式// 执行查询
void WordQuery::doQuery(RedisClient& redisClient, const string &s, const TcpConnectionPtr &ptr)
{
// 先查询缓存
auto redisResult = redisClient.get(s);
if (redisResult.first)
{
ptr->sendInEventLoop(redisResult.second);
return;
}
// 提取关键字和搜索文本
auto parseSearchTextResult = parseSearch(s);
/**
* 构建返回结果所需:
* (1)set eventIds:事件id
* (2)map> wordsMap : 词频记录(当前搜索语句所构建的event的)
* (3)map>> vec :每个词与其权重(当前搜索语句所构建的event的)
*/
set<int> eventIds;
map<int, map<string, int>> wordsMaps;
map<int, vector<pair<string, double>>> vecs;
// 循环遍历关键字和搜索文本,构建结果
searchThrough(eventIds, wordsMaps, vecs, parseSearchTextResult.first, parseSearchTextResult.second);
// 根据第一个搜索map和搜索文本的vec 计算余弦排序,形成摘要
string message = doReturn(eventIds, wordsMaps.begin()->second, vecs.begin()->second, ptr);
// 设置缓存
redisClient.set(s, message);
}