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

C++ 搜索引擎项目实战:日志系统与 Server 入口详解

搜索引擎项目中的日志系统与 Server 端实现是核心环节。通过自定义宏利用 __FILE__ 和 __LINE__ 定位日志来源,结合 fgets 处理输入流以支持空格查询。内容涵盖日志宏定义、主函数初始化流程及搜索交互逻辑,适合需要构建基础搜索架构的开发者参考。

菩提发布于 2026/3/27更新于 2026/7/2032 浏览
C++ 搜索引擎项目实战:日志系统与 Server 入口详解

日志系统设计

在工程实践中,完善的日志系统是排查问题的基石。C/C++ 编译器提供了两个特殊的预定义宏,用于精确定位日志来源:

  • __FILE__:自动替换为当前源文件的路径或文件名。例如在 test.cpp 中调用,日志将显示 [test.cpp : ...]。
  • __LINE__:自动替换为当前代码所在的行号。若在第 25 行调用,日志将显示 [test.cpp : 25]。

基于这两个宏,我们可以封装一个统一的日志输出接口。以下是一个示例实现,定义了不同级别的日志宏并调用底层打印函数:

#pragma once
#include <iostream>
#include <string>
#include <ctime>

#define NORMAL 1
#define WARNING 2
#define DEBUG 3
#define FATAL 4

// 宏定义:将级别、消息、文件、行号传递给 log1 函数
#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;
}

Server 端实现

Server 程序负责加载数据源、初始化搜索器并响应用户查询。数据源通常存储在 data/raw_html/raw.txt,前端资源位于 ./wwwroot/。

在主循环中,我们需要读取用户的搜索关键字。这里选择 fgets 而非 cin,因为 cin >> 遇到空格会截断输入,而 fgets 能整行读取,更适合处理包含空格的查询词。注意,fgets 会将换行符也读入缓冲区,需要在处理前移除。

以下是 server.cc 的核心逻辑:

#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 (true) {
        std::cout << "Enter Search Query: ";
        // 使用 fgets 读取整行,避免 cin 忽略空格的问题
        fgets(buffer, sizeof(buffer) - 1, stdin);
        
        // 去除 fgets 读入的换行符
        if (strlen(buffer) > 0 && buffer[strlen(buffer) - 1] == '\n') {
            buffer[strlen(buffer) - 1] = 0;
        }
        
        query = buffer;
        search->Search(query, &json_string);
        std::cout << json_string << std::endl;
    }
    return 0;
}

注意:实际运行中需确保 searcher.hpp 已正确编译链接,且数据路径存在。

目录

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

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

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

更多推荐文章

查看全部
  • Hive 自定义函数输入输出特性:UDF、UDAF 与 UDTF
  • 数据结构:栈的原理与 C 语言实现
  • 鸿蒙分布式智能办公应用架构设计与性能优化实践
  • Pi0 机器人大模型在昇腾 A2 上的部署与性能测评
  • 整合 LLama-Factory 引擎增强 NPC 对话逻辑的技术实践
  • LeetCode 202. 快乐数:快慢指针与循环检测
  • Python IDE 集成本地 DocsGPT 助手实战指南
  • Effective Modern C++ 第 37 条:确保 std::thread 析构前不可结合
  • Go 语言实现奇偶转置排序算法
  • C++高性能服务器开发:CPU核心绑定与性能优化
  • 深入解析 LRU 与 LFU 缓存淘汰算法
  • 无需公网 IP 安全访问本地 AI 服务的方案
  • AI 驱动下的软件测试:全生命周期优化与实践
  • OpenClaw 对接腾讯 QQ 实战部署指南
  • TrendRadar 本地部署指南:Docker 配置与 AI 热点分析
  • Megick Studio 桌面客户端下载 2026
  • 开源模型 Llama3.1 本地部署与实战指南
  • 全网降AIGC工具大盘点:DeepSeek、笔灵AI等评测
  • Java + Leaflet 构建湖南省道路长度 WebGIS 系统
  • Spring Boot 集成 MyBatis 操作数据库详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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