跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 基于正倒排索引的 Boost 搜索引擎:日志宏与 Server 主程序详解

C++ 搜索引擎项目中日志系统的实现细节,利用 __FILE__ 和 __LINE__ 宏记录日志来源文件和行号,并通过封装 log1 函数统一输出格式。同时解析了 Server 端主程序逻辑,演示了如何通过 fgets 安全读取用户查询指令,调用 Searcher 类执行搜索并将结果以 JSON 格式返回。

LinuxPan发布于 2026/3/30更新于 2026/7/838 浏览
C++ 基于正倒排索引的 Boost 搜索引擎:日志宏与 Server 主程序详解

为了更好地监控项目运行状态,日志记录是开发过程中不可或缺的一环,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);
        if (strlen(buffer) > 0) {
            buffer[strlen(buffer) - 1] = 0;
        }
        query = buffer;
        search->Search(query, &json_string);
        std::cout << json_string << std::endl;
    }
    return 0;
}

文章配图

目录

  1. 1. 日志
  2. 2. server.cc
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 大模型幻觉纠正与知识蒸馏新进展:HalluEditBench 与 SIKeD 研究解读
  • Linux 多线程核心:资源划分与控制实战指南
  • Windows 环境下 Git 安装与配置指南
  • PyWebIO 实现精准弹窗交互的关键点
  • 数据结构初阶:二叉树的链式存储结构详解
  • Java Map 常用方法与实现类深度详解
  • Java 动态代理核心原理与实战对比
  • C++ 类与对象:面向对象编程入门
  • GitHub Copilot 代理配置与网络优化实战指南
  • Android 开发中 OOM 问题的常见原因与解决方案
  • 从多库并存到一库多能:金仓数据库融合架构实践
  • 利用统一 API 接口实现大模型选型与成本优化
  • 分布式文件系统 HDFS 存储原理详解
  • 创业公司追逐 AGI 愿景:真的必要吗?
  • 鸿蒙金融理财全栈项目安全合规与用户体验优化
  • 法律领域自然语言处理(NLP)应用与实战
  • Java IO 流进阶:字符流与字节流的核心应用
  • C 语言 Web 开发实战:CGI、FastCGI 与 Nginx 模块详解
  • PyTorch 2.0 深度学习入门与实战指南
  • RAG 检索增强生成技术实战与架构解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online