编译环境deepin-vim,这是一个基于github,新浪微博和boost库的简单搜索引擎的后端实现,前端具体实现我在github上面看见有两个非常完备的搜索引擎项目:
https://github.com/mamengchen/searchEngine是一个基于RSS文本内容检索的轻量级搜索引擎
https://github.com/mamengchen/Search_Project是一个模拟百度搜索的方式实现站内搜索引擎,整个项目分为两大部分,HTTP服务器和搜索服务器
1.前提
搜索引擎是一个经久不衰的项目,以后的时代必然是互联网时代,而上网我们大多数情况都会做搜索相关的事情。所以掌握最基础的实现索引技术是程序员必然的基本素养之一。
完备的搜索引擎:
- 带有一个输入框
- 点击搜索之后,得到了搜索界面
- 搜索结果页中的每个结果都是和查询词有一定的关联关系的
- 点击搜索的时候,会跳转到另外一个网站上
github,新浪微博都是可以从浏览器上下载它的代码的,boost是我们要用其中的boost::filesystem提供了一些对系统文件的操作方法,具体方法概述请参考:https://www.cnblogs.com/yxysuanfa/p/7400250.html
2.实现原理以及示意图
2.1示意图:
2.2实现原理:
2.2.1文件解剖器的中的详细过程。
数据处理模块
把boost文档中涉及到的html进行处理:
1、去标签
2、把文件进行合并
把文件中涉及到的N个HTML的内容合并成一个行文本文件。
生成的结果是一个大文件,里面包含很多行,每一行对应boost文档中的一个html,这么做的目的是为了
让后面的索引模块处理来跟方便
3、对文档的结构进行分析,提取出文档的标题,正文,目标url
这个就是对boost中筛选出后缀是.html的文件,把其中的目录和不是这个后缀的去掉,并且把筛选过的文件放入的file_list中去。其中用到了boost::filesystem的一些方法这里提供一个链接可以帮助理解:https://www.cnblogs.com/yxysuanfa/p/7400250.html
bool EnumFile(const std::string& input_path,
std::vector<std::string>* file_list)
{
//命名空间的简化
namespace fs = boost::filesystem;
//input_path 是一个字符串,根据这个字符串构造出一个path对象
fs::path root_path(input_path); //初始化
if (!fs::exists(root_path)) //如果文件不存在打印下面的话
{
std::cout << "input_path not exist! input_path = "
<< input_path << std::endl;
return false;
}
//boost递归遍历目录,借助一个特殊的迭代器
//下面是构造一个未初始化的迭代器作为遍历结束标记
fs::recursive_directory_iterator end_iter;
for (fs::recursive_directory_iterator iter(root_path); //从头读到尾部
iter != end_iter; ++iter)
{
//a>此处我们应该剔除目录
if (!fs::is_regular_file(*iter))
{
continue;
}
//b>根据扩展名,只保留 html
if (iter->path().extension() != ".html")
{
continue;
}
file_list->push_back(iter->path().string());
}
return true;
}
这里通过我对html语言的了解知道文本的标题它都用<title></title>包含着,先用find找到他们第一个点下表,然后使第一个下标走个它的长度就到你标题的下标了,标题下标到</title>取出来就是标题信息,这里提到的正则表达式是应付更加麻烦的分类的方法就是加入你还要细分有些东西就是得靠一些特殊字符,这是正则表达式的demo:https://www.cnblogs.com/lizhenlin/p/6654934.html
//从html中的title标签中提取标题
//正则表达式
//<title></title>
bool ParseTitle(const std::string& html, std::string& title)
{
//1、先查找<title>标签
size_t beg = html.find("<title>");
if (beg == std::string::npos)
{
std::cout << "<title> not found!" << std::endl;
return false;
}
//2、再查找</title>标签
size_t end = html.find("</title>");
if (end