如何在Peewee与SQLite FTS5中使用trigram分词器及相似度匹配功能?
Peewee中使用FTS5 trigram分词器的解决方法
你遇到的peewee.OperationalError: no such tokenizer: trigram报错与Peewee框架本身无关,问题出在SQLite环境的配置上。porter等分词器属于FTS5内置的默认组件,所以使用时不会触发报错,但trigram属于FTS5的实验性可选扩展,默认绝大多数预编译的SQLite版本都没有启用该功能。
步骤1:先确认SQLite本身是否支持trigram
你可以先直接通过sqlite3命令行执行以下语句,排查是否是SQLite层面的问题:
CREATE VIRTUAL TABLE test_tri USING fts5(content, tokenize="trigram");
如果该语句执行也报类似的no such tokenizer: trigram错误,就可以确认是SQLite环境没有开启trigram扩展,接下来针对性处理即可。
步骤2:给SQLite启用trigram扩展
有两种常用的启用方式:
方式一:编译带trigram支持的SQLite
编译SQLite时需要添加以下两个编译参数:
-DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_FTS5_TRIGRAM
编译完成后替换你当前环境使用的SQLite库即可。如果是Python环境,你也可以重新编译pysqlite3包,编译时带入上述参数,之后在项目中用pysqlite3替换标准库自带的sqlite3模块使用。
方式二:运行时动态加载trigram扩展
如果你的SQLite版本支持动态加载扩展,你可以提前获取编译好的trigram扩展库文件(不同系统后缀不同,Linux一般为.so,Windows为.dll,Mac为.dylib),然后在Peewee初始化数据库连接后,先执行扩展加载语句:
from peewee import SqliteDatabase db = SqliteDatabase('你的数据库文件路径.db') # 加载trigram扩展 db.execute_sql("SELECT load_extension('你的扩展库文件绝对路径')")
注意需要确保你的SQLite没有禁用扩展加载功能。
步骤3:验证Peewee配置
等SQLite层面支持trigram之后,你之前写的FTS模型Meta配置无需修改,直接执行建表语句即可正常运行。
class Meta: db_table = 'fts_test_db' database = test_db options = {'tokenize': 'trigram', 'content': PrecedentPW}
内容的提问来源于stack exchange,提问作者xax
相关产品推荐
相关产品推荐

