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

C++ 搜索引擎项目实战:日志系统与 Server 端核心逻辑

本项目展示了 C++ 搜索引擎的基础架构,重点实现了日志系统和服务端入口。日志部分利用 __FILE__ 和 __LINE__ 宏定位代码位置,封装了带时间戳和级别的打印函数。服务端采用循环读取模式,使用 fgets 完整捕获含空格的查询词,调用 Searcher 类处理后返回 JSON 结果。整体结构简洁,适合进一步集成倒排索引等核心算法。

云间漫步发布于 2026/3/15更新于 2026/7/1832 浏览
C++ 搜索引擎项目实战:日志系统与 Server 端核心逻辑

在项目开发中,日志是不可或缺的一环。通过日志,我们可以随时掌握程序运行状态,排查问题也更有依据。服务端代码则是整个项目的入口,负责调用各个模块完成实际业务。

1. 日志系统实现

C/C++ 编译器提供了两个预定义宏 __FILE__ 和 __LINE__,它们能自动获取当前源文件路径和行号。利用这两个宏,我们可以在日志输出时精确定位到出错位置。

  • __FILE__:被替换为当前源文件的文件名或路径字符串。
  • __LINE__:被替换为当前代码所在的行号整数。

例如在 test.cpp 第 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

// 宏展开后调用 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;
}

这样每次调用 LOG1 时,都会自动带上时间戳、文件位置和行号,方便后续追踪。

2. Server 端入口

服务端主要职责是接收用户查询,调用搜索类处理数据,并返回 JSON 格式的结果。数据源通常存放在 data/raw_html/raw.txt,前端静态资源放在 ./wwwroot/。

主程序中实例化 Searcher 类,调用 InitSearcher 初始化索引。这里有一个细节:读取输入时使用了 fgets 而不是 cin。原因是 cin >> query 遇到空格会截断,而搜索引擎的关键词往往包含空格,fgets 可以整行读取。

读取到的缓冲区末尾可能包含换行符,需要手动去掉。处理后的查询字符串交给 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: ";
        // 使用 fgets 保留空格
        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 端入口
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Flutter 组件 tavily_dart 在鸿蒙平台的适配与 AI 搜索集成实战
  • Flutter 三方库 webkit_inspection_protocol 在鸿蒙系统的适配指南
  • CycleGAN 详解与实现:无配对图像转换技术
  • Java 无锁队列 Disruptor 核心原理分析
  • VS Code 中常用的 Python 代码格式化工具
  • 程序员转行方向推荐:数据分析师、AI 大模型工程师、产品经理与云计算工程师
  • 基于 Leaflet 和天地图的长沙市免费运动场所 WebGIS 可视化
  • eBay 商品数据采集实战:Python 调用网页抓取 API 接入方案
  • SpringBoot 校园讲座管理系统设计与实现
  • EvoCUA 刷新开源 SOTA:会操作电脑且持续进化的智能体
  • 使用 Ollama 本地运行 Llama-3.2-3B 模型指南
  • 码农与软件工程师的核心区别及能力要求
  • OpenAI 发布 GPT-4o 模型,实现多模态实时交互
  • 位图、布隆过滤器与哈希切分的高效数据处理技术
  • 昇腾 NPU 部署 Llama 2 模型的性能测试与优化实践
  • 默认安全治理实践:水平越权检测与前端安全防控
  • 医疗领域自然语言处理应用与实战
  • Meta Llama 3 发布:性能媲美 GPT-4 的开源大模型详解
  • Python 为何在数据分析领域广受欢迎?
  • LLM 面试真题与答案详解:基础、微调及 LangChain 篇

相关免费在线工具

  • 加密/解密文本

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