这几天在思考如何对项目做出扩展,当一个网站访问量上升之后随之而来的便是用户的大量交流,根据现在主流的交流方式来看,一般都是一个用户先进行发帖,然后其他用户在下面对之评论,评论系统暂且搁置一边不谈,现在有一个问题就是当帖子数量越来越多,如何快速找到与关键词相对应的帖子,使用关键字在数据库中遍历不太现实,但其实仔细想想搜索引擎不就是做这个的吗,于是就想着实现一个简单的搜索引擎。
要实现一个简单的搜索引擎,必要的相关知识一定是必不可少的,简单来说,第一步先要对已有的资源进行整理,根据整理出来的结果构建索引,搜索模块根据给定关键词查找索引给出排序结果
对已有资源进行整理
搜索引擎使用的前提就是有大量的html文档,需要搜索引擎来做出某种处理来给出正确的结果,所以搜索引擎内部就需要对web杂乱的资源进行管理,以此来完成后面的工作,我们现在假设某一个html目录内有几千条html页面,我们需要对这些页面依次遍历进行统计,将页面中的标题,正文以及html对应在web中的url以某种格式保存下来,这里是保存在一个文件中。
C++提供的库中还不足以让我们拥有遍历整个目录这个功能,所以这里需要借助boost库。
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>
const std::string g_input_path = "../data/input"; // 待解析的html文档都在这个目录下
const std::string g_output_path = "../data/output/pase_file"; //将解析结果放在这个文件中
struct docInfo {
std::string title;
std::string url;
std::string content;
};
bool enumFile(const std::string& input_path, std::vector<std::string>& file_list) {
namespace fs = boost::filesystem;
fs::path root_path(input_path);
if(!fs::exists(root_path)) {
std::cout << "input err " << __FILE__ << ":" << __LINE__ << std::endl;
return false;
}
// boost递归遍历目录,借助迭代器
fs::recursive_directory_iterator end_iter;
for(fs::recursive_directory_iterator iter(root_path); iter != end_iter; ++iter) {
if(!fs::is_regular_file(*iter