Go + SQLite FTS5 + BM25 + 中文分词
Go + SQLite FTS5 + BM25 + 中文分词 SQLite 自带 FTS5 全文检索模块,也内置了 bm25() 排序函数。对于英文或已经用空格分隔的文本,FTS5 可以直接建立索引;但中文没有天然空格,unicode61 tokenizer 不知道“孙悟空大闹天宫”应该切成哪些词。 所以比较稳的做法是: 在 Go 层先做中文分词,把分词后的 token 用空格拼起来,再交给 SQLite FTS5。 这篇文章整理一个最小可落地的方案:普通表保存原文,FTS5 表保存分词后的索引文本,查询时同样先分词,再用 MATCH 召回、bm25() 排序。 核心流程 flowchart LR A["原始文档"] --> B["Go 中文分词"] B --> C["写入 FTS5 索引表"] D["用户查询"] --> E["Go 查询分词"] E --> F["构造 FTS5 Query"] F --> G["MATCH 召回"] G --> H["BM25 排序"] H --> I["Join 原文表"] 这里有两个关键点: 写入索引和用户查询要使用同一套分词策略。 FTS5 表里的 rowid 最好和业务表的 id 对齐,方便查回原文。 建表 普通表保存原始数据: ...