C++之基于正倒排索引的Boost搜索引擎项目日志+server代码及详解
本文介绍了项目开发中的日志系统和搜索功能实现。日志系统使用__FILE__和__LINE__宏自动记录文件名和行号,并定义log1函数格式化输出日志信息。搜索功能部分通过Searcher类实现,从指定路径读取数据源,使用fgets接收用户查询(处理换行符),调用Search函数获取JSON格式的搜索结果并输出。文中还解释了代码中关键语句的作用,如去除换行符和文件路径设置等。
首先为了更好的查看自己的项目状况,日志是我们做项目可以说必须要写的一部分。而server部分我们可以理解为写了这么多的类就是为了在这里使用。
1. 日志
__FILE__
和__LINE__
是 C/C++ 编译器预定义的特殊宏:
__FILE__
:
它会被编译器自动替换为当前代码所在源文件的路径或文件名(字符串类型)。
在日志函数中,它的作用是记录 “这条日志是从哪个文件输出的”。
例如:如果在 test.cpp
中调用 LOG1
宏,__FILE__
就会被替换为 "test.cpp"
(具体可能包含路径,取决于编译器),最终日志中会显示 [test.cpp : ...]
。
__LINE__
:
它会被编译器自动替换为当前代码所在的行号(整数类型)。
在日志函数中,它的作用是记录 “这条日志是从文件的哪一行输出的”。
例如:如果 LOG1
宏调用写在 test.cpp
的第 25 行,__LINE__
就会被替换为 25
,最终日志中会显示 [test.cpp : 25]
。
然后创建一个log1函数,一个一个打印出外面想要看到的信息。
#pragma once
#include <iostream>
#include <string>
#include <ctime>
#define NORMAL 1
#define WARNING 2
#define DEBUG 3
#define FATAL 4
#define LOG1(LEVEL, MESSAGE) log1(#LEVEL, MESSAGE, __FILE__, __LINE__)
void log1(std::string level, std::string message, std::string file, int line)
{
std::cout << "[" << level << "]" << "[" << time(nullptr) << "]"
<< "[" << message << "]" << "[" << file << " : " << line << "]" << std::endl;
}
2.server.cc
"data/raw_html/raw.txt这个路径下存的是我们的数据源,./wwwroot/可以理解为前段网页的代码。
queue是要搜索的关键字,json_string是返回给用户的搜索结果。
接下来就是先实例化一个Searcher类,然后调用InitSearcher函数。这边使用fgets而不用cin是因为cin会忽略空格,而fgets可以整行读取。
buffer[strlen(buffer)-1]=0;是因为用户在输入的时候会有换行符,我们要去掉这个。然后把处理后的结果交给query,然后调用Search函数,把经过处理后的结果交给json_string,然后输出。
#include"searcher.hpp"
#include<iostream>
#include<string>
#include<cstdio>
const std::string input="data/raw_html/raw.txt";
const std::string root_path = "./wwwroot";
int main()
{
ns_searcher::Searcher* search=new ns_searcher::Searcher();
search->InitSearcher(input);
std::string query;
std::string json_string;
char buffer[1024];
while(1)
{
std::cout<<"Enter Search Query: ";
//std::cin>>query;
fgets(buffer,sizeof(buffer)-1,stdin);
buffer[strlen(buffer)-1]=0;
query=buffer;
search->Search(query,&json_string);
std::cout<<json_string<<std::endl;
}
return 0;
}
更多推荐
所有评论(0)