我正在研究索引存储在SQLite FTS3虚拟表中的应用程序。我们正在实施全文匹配,这意味着我们通过以下查询发送:
select * from blah where term match '<insert term here>'
在我们想要匹配的术语包含连字符的情况下,如果SQLite虚拟匹配语法将培根和鸡蛋解释为培根,而不是鸡蛋,那么这一切都很好。
是否有人知道转义字符使fts表忽略连字符?我尝试添加一个ESCAPE'\'子句并在每个连字符之前使用\但匹配语句拒绝该语法。
感谢。
答案 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
再次,请注意搜索词的双引号和单引号的巧妙用法。