搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上采集信息,在对信息进行组织和处理后,为用户提供检索服务,将检索的相关信息展示给用户的系统
网页搜索结果展现的三要素:标题、摘要、网页链接
项目准备
boost 官网: https://www.boost.org/
在boost官网下载所需版本的库,然后解压,只保留doc目录下的html文件
此层主要执行数据清洗及去标签功能
标签:HTML的标签,如
采用如下方式对解析好的数据进行保存:
title\3content\3url \n title\3content\3url \n title\3content\3url \n ...
//读取文件内容
bool EnumFile(const std::string &src_path, std::vector *files_list);
//解析文件
bool ParseHtml(const std::vector &files_list,
std::vector *results);
//保存文件
bool SaveHtml(const std::vector &results, const std::string &output);
此层主要建立文档的正排索引和倒排索引
DocInfo *BuildForwardIndex(const std::string &line)
//解析line,字符串切分
//将字符串填充到DocInfo
//插入到正排索引的vecotr
bool BuildInvertedIndex(const DocInfo &doc)
//倒排拉链:[关键字和倒排拉链的映射关系]
//对标题进行分词
//对标题进行词频统计
//对正文进行分词
//对正文进行词频统计
void InitSearcher(const std::string &input)
//1. 获取或者创建index对象
//2. 根据index对象建立索引
void Search(const std::string &query, std::string *json_string)
//1.[分词]:对我们的query进行按照searcher的要求进行分词
//2.[触发]:就是根据分词的各个"词",进行index查找,建立index是忽略大小写,所以搜索,关键字也需要
//3.去重,由于内容可能出现多个相同关键字,但建立的索引是一样的,所以要进行去重
//4.[合并排序]:汇总查找结果,按照相关性(weight)降序排序
//5.[构建]:根据查找出来的结果,构建json串
std::string GetDesc(const std::string &html_content, const std::string &word)
//1. 找到首次出现
//2. 获取start,end , std::size_t 无符号整数
//3. 截取子串,return
http_server
建立项目的日志,便于排查
#pragma once
#include
#include
#include
#define NORMAL 1
#define WARNING 2
#define DEBUG 3
#define FATAL 4
#define LOG(LEVEL, MESSAGE) log(#LEVEL, MESSAGE, __FILE__, __LINE__)
void log(std::string level, std::string message, std::string file, int line)
{
std::cout << "[" << level << "]" << "[" << time(nullptr) << "]" << "["
<< message << "]" << "[" << file << " : " << line << "]" << std::endl;
}
安装boost库
sudo yum install -y boost-devel
安装cppjieba
git clone https://gitcode.net/mirrors/yanyiwu/cppjieba.git
//还需执行下面的命令,否则编译不通过
cd cppjieba; cp -rf deps/limonp include/cppjieba/
安装jsoncpp
sudo yum install -y jsoncpp-devel
安装cpp-httplib
建议cpp-httplib 0.7.15 ,新版httlib可能会和非最新的gcc有不兼容问题
git clone https://gitee.com/zhangkt1995/cpp-httplib?_from=gitee_search
需要升级gcc到7.0以上,否则无法使用cpp-httplib
//安装scl
sudo yum install centos-release-scl scl-utils-build
//安装gcc
sudo yum install -y devtoolset-7-gcc devtoolset-7-gccc++
//将启动命令编写到~/.bash_profile
scl enable devtoolset-7 bash
Makefile
PARSER=parser
SSVR=search_server
HTTP_SERVER=http_server
cc = g++
.PHONY:all
all:$(PARSER) $(SSVR) $(HTTP_SERVER)
$(PARSER):parser.cc
$(cc) -o $@ $^ -lboost_system -lboost_filesystem -std=c++11
$(SSVR):server.cc
$(cc) -o $@ $^ -ljsoncpp -std=c++11
$(HTTP_SERVER):http_server.cc
$(cc) -o $@ $^ -ljsoncpp -lpthread -std=c++11
.PHONY:clean
clean:
rm -f $(PARSER) $(SSVR) $(HTTP_SERVER)
在终端执行make命令后,
./http_server
之后访问http//:主机号:绑定的端口号,即可使用搜索引擎