文脉·艺文类聚

首页 › 析疑 › 第 55 问

为什么用两字词在库里搜不到,比如搜「兰亭」结果为0?

库中全文检索表 passage_fts 使用 trigram 分词,按连续三字建索引。因此三字以上的词可以直接 MATCH,如「桃花源」能命中三条;两字词如「兰亭」不入 trigram 索引,直接 MATCH 会返回 0。这不是库里没有「兰亭」,而是检索方式不对。两字检索应改用 LIKE,例如在 passage.text 上执行 like '%兰亭%';或者在 FTS 上先补一个字再搜,如兰亭序会稽兰。这一限制来自 SQLite 的 trigram 分词器设计,不是数据缺失。实际操作建议:三字以上用 FTS,两字用 LIKE,单字用 LIKE 并配合部、门过滤。另需注意底本用「.」作句读,FTS 索引里标点也占位,但 trigram 只按字符切,标点不参与匹配,所以不必先把「.」换成「。」再搜。两字检索还有一个替代办法:用 SQL 的 LIKE 配合部、门过滤,如先按 section_group 找到「兰」相关门,再在门内 LIKE 搜「兰亭」。这样既避开 trigram 的两字限制,又不会被全库噪声淹没。三字以上仍建议用 FTS,速度快且能排序。trigram 的两字限制还影响人名检索:两字人名如「陆机」「沈约」不能直接 MATCH,需用 LIKE 或加一字。三字以上的人名、书名、门名则可用 FTS。检索前先判断关键词长度,再选工具,能省很多无效查询。检索工具的选择,本质上是对数据形态的尊重;用错工具,不是数据坏了,而是方法不对。工具选对,检索才有意义;工具选错,先别怀疑数据。
检索与缺口卷 1

« 回到析疑列表 | 共 57 问