--- id: pitfalls/sqlite-cjk-tokenizer.md kind: fact summary: unicode61 把整段中文当一个 token,trigram 漏掉两字词,必须自己分词。 highlight: 实测:unicode61 查"部署"=0 命中;trigram 查"部署"=0 命中(需≥3字符) created: 1791512161994 updated: 1791512161994 load_when: - SQLite - FTS5 - 全文检索 - 分词 - 中文检索 --- 在 SQLite 3.53.4 上实测,字符串「部署脚本用 pnpm 而不是 npm,因为 lockfile 不兼容」: - `unicode61`(FTS5 默认)把 `部署脚本用` 当作**一个 token**,整句只产生 7 个词条。查「部署」0 命中,查「部署脚本」也 0 命中。子串永远匹配不上。 - `trigram` 要求查询 ≥3 字符。词表是「不兼」「而不」「m,因」这种三字滑窗。查「部署」0 命中,查「部署脚」1 命中。 中文里「部署」「配置」「依赖」「接口」这类**两字词占比极高**,trigram 漏掉的正好是最常用的一批。 解法:索引前自己切 CJK 字符二元组,拉丁走 porter 词干,FTS5 只当倒排索引用。