Sqlite FTS5:使用 Trigram Tokenizer 进行子字符串匹配

Posted

技术标签:

【中文标题】Sqlite FTS5:使用 Trigram Tokenizer 进行子字符串匹配【英文标题】:Sqllite FTS5: Substring matching using Trigram Tokenizer 【发布时间】:2021-07-07 08:08:36 【问题描述】:

我正在考虑使用 Trigram Tokenizer 来支持 FTS 中的子字符串匹配。

参考:https://sqlite.org/fts5.html#the_experimental_trigram_tokenizer

我创建了一个虚拟表和数据,如下所示:

CREATE VIRTUAL TABLE tri_test USING fts5(a, tokenize="trigram");
INSERT INTO tri_test VALUES('abcde\fghij KLMNOPQRST uvwxyz');

但是,当我使用具有非字母数字字符(例如反斜杠 (\))的搜索文本进行选择查询时,它会抛出错误。

SELECT * FROM tri_test('cde\fg');

错误:

Execution finished with errors.
Result: fts5: syntax error near "\"
At line 74:
SELECT * FROM tri_test('cde\fg');

当我尝试使用 MATCH 运算符时也会出现同样的问题

SELECT * FROM tri_test where tri_test MATCH 'cde\fg';

有没有办法逃脱这样的角色?请帮忙!

【问题讨论】:

【参考方案1】:

我们可以通过在要搜索的字符串周围添加双引号来转义这些特殊字符。

SELECT * FROM tri_test where tri_test MATCH '"cde\fg"';

【讨论】:

以上是关于Sqlite FTS5:使用 Trigram Tokenizer 进行子字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章

Peewee 可以使用 SQLite 的 FTS5(全文搜索)辅助函数 highlight() 吗?

如何使用带有 Python 3.7 的 sqlite3 python 模块的 FTS5 扩展?

在 sqlite fts5 查询中使用 Match 但需要更多地控制排名?

C# SQLite FTS5 表和触发器创建

如何在 Ubuntu 16.04 上将 FTS5 扩展与带有 Python 3.7 的 sqlite3 python 模块一起使用?

Sqlite FTS5 标点符号在选择查询中不起作用