SQLite FTS如何匹配包含指定字符串的所有行?
SQLite FTS 子串匹配解决方案
先明确你遇到的问题根源:
^abc*是匹配以abc开头的完整token,比如字段值为abc或abcd会被命中,但0abc的token是0abc,并非以abc开头,所以返回0结果。*abc*报错是因为SQLite FTS的MATCH语法不允许在查询词开头使用*,仅支持在结尾用*做前缀匹配。
针对你需要匹配所有包含abc子串的需求(包括abc、abcd、0abc、0abcd等场景),有两种可行方案:
方案1:直接使用LIKE(简单通用)
如果数据量不大或对性能要求不高,直接用LIKE通配符就能满足需求:
SELECT * FROM notes WHERE notes LIKE '%abc%';
这个语句会匹配所有字段值中包含abc子串的行,完全覆盖你要的场景。
方案2:利用FTS5的Trigram分词器(高性能)
如果你的表是FTS5虚拟表,想要借助全文索引提升查询性能,可以用Trigram分词器实现子串匹配:
- 新建表时指定Trigram分词器:
CREATE VIRTUAL TABLE notes USING fts5(content, tokenize='trigram');
- 执行查询:
SELECT * FROM notes WHERE notes MATCH 'abc';
Trigram分词器会将文本拆分为连续的三字组合,因此abc会匹配所有包含该子串的内容,同时能借助FTS索引大幅提升查询速度。
如果你的表是FTS3/FTS4,由于不支持Trigram分词器,LIKE是最直接的选择。
内容的提问来源于stack exchange,提问作者user15249905
相关产品推荐
相关产品推荐

