SQLite虚拟表匹配转义字符

时间:2010-01-08 12:29:50

标签: sqlite full-text-search

我正在研究索引存储在SQLite FTS3虚拟表中的应用程序。我们正在实施全文匹配,这意味着我们通过以下查询发送:

select * from blah where term match '<insert term here>'

在我们想要匹配的术语包含连字符的情况下,如果SQLite虚拟匹配语法将培根和鸡蛋解释为培根,而不是鸡蛋,那么这一切都很好。

是否有人知道转义字符使fts表忽略连字符?我尝试添加一个ESCAPE'\'子句并在每个连字符之前使用\但匹配语句拒绝该语法。

感谢。

3 个答案:

答案 0 :(得分:2)

FTS认为有很多字符串是“特殊的”,需要进行转义。最简单的方法是在要搜索的字符串周围添加DOUBLE引号。

示例1 :假设您要搜索的字词为bacon-and-eggs

select * from blah where term match '"bacon-and-eggs"'

这也将整个字符串视为短语,因此以不同顺序使用相同单词的匹配不会产生任何匹配。为了解决这个问题,你可以单独引用每个单词。

示例2 :假设您要搜索的字词为bacon and eggs

select * from blah where term match '"bacon" "and" "eggs"'

希望这有助于某人!

答案 1 :(得分:0)

FTS忽略索引中的所有非字母数字字符。在将搜索词发送到FTS之前,您可以将其转换为

bacon NEAR/0 AND NEAR/0 eggs

搜索相邻的单词。

答案 2 :(得分:0)

这个问题较旧,涉及fts3,但是我想我要添加一个更新以显示如何使用较新的fts5

让我们首先在命令行上设置测试环境:

$ sqlite3 ":memory:"

然后创建一个可以处理破折号的fts5表:

sqlite> CREATE VIRTUAL TABLE IF NOT EXISTS blah USING fts5(term, tokenize="unicode61 tokenchars '-'");

请注意,在tokenize值中使用了双引号和单引号。

在不进行设置的情况下,让我们添加一些值来搜索:

sqlite> INSERT INTO blah (term) VALUES ('bacon-and-eggs');
sqlite> INSERT INTO blah (term) VALUES ('bacon');
sqlite> INSERT INTO blah (term) VALUES ('eggs');

然后让我们实际搜索它们:

sqlite> SELECT * from blah WHERE term MATCH '"bacon-and-eggs"';
bacon-and-eggs
sqlite> SELECT * from blah WHERE term MATCH '"bacon"*';
bacon-and-eggs
bacon

再次,请注意搜索词的双引号和单引号的巧妙用法。