# sese-engine Go 重构版 Python 原版的 Go 语言重构,使用标准英文命名,单二进制部署。 ## 目录结构 ``` golang/ ├── main.go # 主入口,goroutine 启动所有模块 ├── go.mod ├── config/ │ └── config.go # 全局配置参数(对应 配置.py) ├── storage/ │ └── storage.go # bbolt 持久化层(对应 存储.py,替换 rimo_storage) ├── crawler/ │ ├── crawler.go # BFS 爬虫调度(对应 上网.py) │ └── fetcher.go # HTTP 获取 + robots.txt + 限流(对应 虫.py) ├── parser/ │ └── parser.go # HTML 解析(对应 文.py) ├── analyzer/ │ └── analyzer.go # 分词 + 关键词权重(对应 分析.py + utils.py 分词部分) │ 使用 gojieba(中文)+ gofasttext(语言检测) ├── harvester/ │ └── harvester.go # 索引写入服务,监听 :5000(对应 收获服务器.py) ├── search/ │ └── server.go # 搜索 API,监听 :80(对应 人服务器.py) ├── backlink/ │ └── backlink.go # 反向链接计算,每 48h 运行(对应 回.py) └── info/ └── info.go # 繁荣表 / 调整表 / 屏蔽词加载(对应 信息.py) ``` ## 依赖项 | Go 包 | 替代 Python 包 | 用途 | |-------|--------------|------| | `github.com/yanyiwu/gojieba` | `jieba` | 中文分词 | | `github.com/nicholasgasior/gofasttext` | `fasttext` | 语言检测 | | `go.etcd.io/bbolt` | `rimo_storage` | KV 存储 / 倒排索引 | | `github.com/andybalholm/brotli` | `brotli` | 压缩 | | `golang.org/x/net/html` | `lxml` | HTML 解析 | | `golang.org/x/net/html/charset` | chardet | 编码检测 | ## 构建与运行 ```bash cd golang # 下载依赖(需要 CGo 编译器,用于 gojieba / gofasttext) go mod tidy # 构建 go build -o sese-engine . # 运行(在 sese-engine 项目根目录下) cd .. ./golang/sese-engine \ --storage ./savedata \ --entry https://zh.wikipedia.org/ \ --fasttext ./lid.176.ftz \ --stopwords ./data/标点符号.json ``` 一个进程启动所有模块: - `:5000` — 收获服务器(爬虫推送关键词) - `:80` — 搜索 API(`GET /search?q=关键词`) - 后台 goroutine — BFS 爬虫 - 后台 goroutine — 每 48 小时反向链接计算 ## 与 Python 版的主要差异 | 方面 | Python 版 | Go 版 | |------|---------|-------| | 并发 | GIL + 线程池(假并发) | goroutine 真并发 | | 存储 | rimo_storage(自研)| bbolt(嵌入式 KV) | | 部署 | 需要 Python 环境 | 单二进制,无运行时依赖 | | 命名 | 全中文 | 标准英文 | | 进程数 | 3~4 个进程 | 1 个进程多 goroutine | | 编码检测 | requests 自动检测 | `golang.org/x/net/html/charset` | | Prometheus | 可选 | 暂未集成(可后续添加) | ## 注意事项 1. **CGo 依赖**:gojieba 和 gofasttext 均需要 C/C++ 编译器(gcc/clang)。 Windows 下建议使用 MinGW 或 WSL。 2. **fasttext 模型**:`lid.176.ftz` 需要与 Python 版共用,路径通过 `--fasttext` 指定。 3. **数据迁移**:存储格式(bbolt JSON)与 Python 版(rimo_storage 二进制)不兼容, 需要全新爬取,或编写迁移脚本。 4. **stop words 文件**:复用 Python 版的 `data/标点符号.json`。