我一直在使用SQLite(3)来建立一个小网站。最近,我发现了SQLite的全文搜索(FTS)功能,并将其用于简单的搜索功能。但是,用户无意中发现搜索字符串中的连字符(' - ')表示错误。它似乎表明应该排除紧随其后的令牌。实际上,当我将连字符更改为加号或空格时,它确实有效。
我的问题:1)我在此分析中是否正确?我阅读SQLite documentation regarding the FTS feature并未找到有关此问题的讨论。 2)我应该如何缓解这种情况?在将连字符传递给SQLite之前手动替换连字符?
我所看到的一个小而具体的例子:
sqlite> CREATE VIRTUAL TABLE fts_table USING fts4
...> ( content TEXT );
sqlite> INSERT INTO fts_table VALUES ("Title: F-1 Race (Game Boy)");
sqlite> INSERT INTO fts_table VALUES ("Title: F-Zero (SNES)");
sqlite> INSERT INTO fts_table VALUES ("Title: F-15 Strike Eagle II (Genesis)");
sqlite> SELECT * FROM fts_table;
Title: F-1 Race (Game Boy)
Title: F-Zero (SNES)
Title: F-15 Strike Eagle II (Genesis)
(此数据库与旧视频游戏有关,您可能已经猜到了。)
因此,网站从用户处获取搜索字符串,并使用MATCH运算符将其插入SELECT语句。对于搜索字符串'f-zero',相关的SQL变为:
sqlite> SELECT * FROM fts_table WHERE content MATCH 'f-zero';
Title: F-1 Race (Game Boy)
Title: F-15 Strike Eagle II (Genesis)
即,它与标题'F-Zero'不匹配。但是,字符串'f + zero'返回正确的内容:
sqlite> SELECT * FROM fts_table WHERE content MATCH 'f+zero';
Title: F-Zero (SNES)
同样,我想在将字符串发送到SQLite之前我可以用'+'或空格替换' - ',但这并不是真正的解决方案。
答案 0 :(得分:8)
我在文档中找到了:
The NOT operator (or, if using the standard syntax, a unary "-" operator)
所以它们是相同的,例如:
-- Query for all documents that contain the term "database", but do not contain
-- the term "sqlite". Document 1 is the only document that matches this criteria.
SELECT * FROM docs WHERE docs MATCH 'database NOT sqlite';
这与:
相同SELECT * FROM docs WHERE docs MATCH 'database -sqlite';
在您的情况下,您必须使用短语查询,如下所示:
SELECT * FROM fts_table WHERE content MATCH '"f-zero"';