如何在SQLite中使用FTS5实现子字符串搜索
在SQLite FTS5中实现子串搜索(匹配'land'这类中间子串)
FTS5默认的匹配规则限制了直接实现子串搜索的方式:
MATCH 'land'仅匹配完整的独立令牌(即单独的'land'单词)MATCH '*land'会报错,因为FTS5仅支持前缀通配符(如land*),不支持后缀或中间通配符
符合要求的解决方案
利用FTS5自动生成的内置术语表([虚拟表名]_terms)来实现子串匹配,无需额外分词器,也避免了直接在主表使用LIKE的性能问题:
SELECT DISTINCT tf.* FROM TrialFTS tf JOIN TrialFTS_terms t ON tf.rowid = t.doc WHERE t.term LIKE '%land%';
方案说明
- FTS5会为每个虚拟表自动创建对应的
[表名]_terms虚拟表,存储内容包括:分词后的令牌(term字段)、令牌所属文档的rowid(doc字段)等 - 通过关联主表与术语表,筛选出令牌中包含'land'子串的记录,再通过
DISTINCT去重(避免同一文档因多个匹配令牌重复返回)
这个方案仅依赖FTS5模块自身功能,未使用额外分词器,也没有直接在主表文本列执行LIKE全表扫描,满足你的需求。
内容的提问来源于stack exchange,提问作者Sayansen
相关产品推荐
相关产品推荐

